# REVISION: 2017-03-14
# Use of read and other bash specific features (bashisms)
Vì ngoặc được sử dụng để phân định một mảng, không phải là một chuỗi :
ids="1 2 3 4";echo ${ids// /|}
1|2|3|4
Một số mẫu: Populating $ids
với hai chuỗi: a b
và c d
ids=("a b" "c d")
echo ${ids[*]// /|}
a|b c|d
IFS='|';echo "${ids[*]}";IFS=$' \t\n'
a b|c d
... và cuối cùng:
IFS='|';echo "${ids[*]// /|}";IFS=$' \t\n'
a|b|c|d
đâu mảng được lắp ráp, cách nhau bằng char 1 của $IFS
, nhưng với không gian thay thế bằng |
trong mỗi phần tử của mảng.
Khi bạn làm:
id="${ids[@]}"
bạn chuyển chuỗi xây dựng từ sự kết hợp của các mảngids
bởi một không gian cho một biến mới của loại chuỗi.
Lưu ý: khi "${ids[@]}"
cho một không gian tách chuỗi, "${ids[*]}"
(với một ngôi sao *
thay vì những lúc đăng nhập @
) sẽ làm cho một chuỗi phân cách bằng ký tự đầu tiên của $IFS
.
gì man bash
nói:
man -Len -Pcol\ -b bash | sed -ne '/^ *IFS /{N;N;p;q}'
IFS The Internal Field Separator that is used for word splitting
after expansion and to split lines into words with the read
builtin command. The default value is ``<space><tab><newline>''.
Chơi với $IFS
:
set | grep ^IFS=
IFS=$' \t\n'
declare -p IFS
declare -- IFS="
"
printf "%q\n" "$IFS"
$' \t\n'
Nghĩa đen là space
, một tabulation
và (có nghĩa là hoặc) a line-feed
. Vì vậy, trong khi ký tự đầu tiên là một khoảng trắng. việc sử dụng *
sẽ thực hiện giống như @
.
Nhưng:
{
# OIFS="$IFS"
# IFS=$': \t\n'
# unset array
# declare -a array=($(echo root:x:0:0:root:/root:/bin/bash))
IFS=: read -a array < <(echo root:x:0:0:root:/root:/bin/bash)
echo 1 "${array[@]}"
echo 2 "${array[*]}"
OIFS="$IFS" IFS=:
echo 3 "${array[@]}"
echo 4 "${array[*]}"
IFS="$OIFS"
}
1 root x 0 0 root /root /bin/bash
2 root x 0 0 root /root /bin/bash
3 root x 0 0 root /root /bin/bash
4 root:x:0:0:root:/root:/bin/bash
Lưu ý: Dòng IFS=: read -a array < <(...)
sẽ sử dụng :
làm dấu phân cách, không được đặt $IFS
vĩnh viễn. Điều này là do dòng đầu ra #2
không gian hiện tại làm dấu phân cách.
'$ {$ {id [*]} ///|}' là một lỗi cú pháp, đó là tất cả các. Dunno những gì bạn đang cố gắng đạt được ở đây. –
Cố gắng để đạt được thay thế biến trong 1 hop, nó sẽ không bao giờ làm việc ... – koola