
以下を使用してデータをSTDIN
配列に渡します。read
prompt$ cat myfile
a "bc" "d e" f
prompt$ read -a arr < myfile
しかし、read
引用された文字列に注意を払わないようで、5つの要素を持つ配列を提供します。
prompt$ echo ${#arr[@]}
5
prompt$ echo ${arr[@]:0}
a "bc" "d e" f
prompt$ echo ${arr[2]}
"d
prompt$ echo ${arr[3]}
e"
私はデフォルト値IFS
:\t\n
inを使用していますbash
。さまざまなツールを使用してタスクを実行する方法はいくつかありますが、読み取りが引用符付き文字列をサポートしていないことに驚きました。
引用符で区切られたリストを配列に入れることに関する他の提案はありますか?
答え1
私はあなたが必要とするものを達成するための良い方法を考えることはできませんが、入力ファイルにbashに有効な構文であるスペースで区切られたトークンが含まれていることを知っている場合は、次のように動作します。
declare -a arr="($(<myfile))"
答え2
これを使用してください:
IFS=$'\n' arr=( $(xargs -n1 <file) )
IFS=$'\n'
Bash 内部フィールド区切り文字を改行に設定します。arr=( ... )
配列定義。xargs -n1 <file
xargs
最大1つのパラメータを読み取りますfile
。引用符内の文字列は、パラメータとして読み込まれると一緒に保持されます。
出力(1行に1つの要素):
$ printf "%s\n" "${arr[@]}"
a
bc
d e
f