VAR=a,b,c,d
# VAR=$(echo $VAR|tr -d '\n')
echo "[$VAR]"
readarray -td, ARR<<< "$VAR"
declare -p ARR
結果:
[a,b,c,d]
declare -a ARR=([0]="a" [1]="b" [2]="c" [3]=$'d\n')
readarray
最後の改行を追加しないようにするにはどうすればよい\n
ですか?最新の$
シンボルの意味は何ですか?
VAR=a,b,c,d
# VAR=$(echo $VAR|tr -d '\n')
echo "[$VAR]"
readarray -td, ARR<<< "$VAR"
declare -p ARR
結果:
[a,b,c,d]
declare -a ARR=([0]="a" [1]="b" [2]="c" [3]=$'d\n')
readarray
最後の改行を追加しないようにするにはどうすればよい\n
ですか?最新の$
シンボルの意味は何ですか?
回答:
暗黙の末尾の改行文字はされないで追加されたreadarray
組み込みが、ここでは、文字列(で<<<
)のbash
、参照bashはここで、文字列が末尾に改行文字を追加しないのはなぜ?。あなたは改行なしで文字列を印刷してそれを取り除きprintf
、プロセス置換技術を介してそれを読むことができます< <()
readarray -td, ARR < <(printf '%s' "$VAR")
declare -p ARR
今は正しく生成されます
declare -a ARR=([0]="a" [1]="b" [2]="c" [3]="d")
split + globを使用できます(リストコンテキストで展開を引用符で囲まないと、どうなりますか)。それはほとんどの場合私たちの邪魔をします、私たちが実際にそれを必要とするときにそれを使わないのは残念です:
IFS=,
set -o noglob
ARR=($VAR) # split+glob with glob disabled, and split using , as delimiter
これは、一時ファイルを作成readarray
してからreadarray <<< "$string"
アプローチのように呼び出すよりも少し複雑です(またreadarray -d
、の最新バージョンが必要であることに注意してくださいbash
)。
注意にもかかわらず、そのS
中にIFS
(を表したセパレータと同じように動作し)、readarray
その中には、a,,b,
に分割され"a"
、""
そして"b"
のみ。
実際の分割演算子の場合は、zsh
代わりに次を使用できます。
ARR=("${(@s:,:)VAR}")
(@
空の要素を保持するための二重引用符)。
readarray <<< "$string"
temppファイルに書き込み、その後、メモリを使用するのではなく、それを削除しますか?
readarray -d
@StéphaneChazelasの回答の缶詰バージョン:
# usage: setarray varname sep string
setarray(){ declare -n a=$1; local IFS=$2 -; set -f; a=($3); }
$ setarray arr , 1,2,3,
$ declare -p arr
declare -a arr=([0]="1" [1]="2" [2]="3")
$ setarray path : "$PATH"
$ setarray ld_preload ': ' "$LD_PRELOAD" # its elements can be separated by either ':' or spaces
...
local -
以下のようなオプションになりますset -f
(noglob
ちょうど変数として、関数にローカル)を。
declare -n a=$1
作成するローカル変数をa
で指定されたグローバル変数に別名として$1
(関数の最初の引数)。
"What is the meaning of the latest $ symbol?"