「a b」、「c d」、「foo bar」などの複数の文字列があります。この文字列セットをループし、それぞれに対してアクションを実行したいと思います。このアクションでは複数の他のスクリプトを呼び出すため、他のスクリプトの呼び出しが中断される可能性があるため、このループの IFS を変更したくありません。このため、これらの文字列に含まれるスペースをエスケープしようとしましたが、成功しませんでした。
例えば、私は
a b
c d
そして私は次のことを試しました:
#!/bin/sh
x="a b"
y="c d"
echo "Attempt 1"
all="$x $y"
for i in $all ; do
echo $i
done
echo "Attempt 2"
all="a\ b c\ d"
for i in $all ; do
echo $i
done
echo "Attempt 3"
all=($x $y)
for i in ${all[@]} ; do
echo $i
done
echo "Attempt 4"
all='"'$x'" "'$y'"'
for i in $all ; do
echo $i
done
echo "Attempt 5"
for i in "$x" "$y" ; do
echo $i
done
echo "Attempt 6"
all2=("a b" "c d");
for i in ${all2[@]}; do
echo $i
done
echo "Attempt 7"
all3="a b c d"
echo $all3|
while read i; do
echo $i
done
5回目の試みだけが成功しましたが、文字列ごとに1つの変数を宣言する必要なくこれを行う、(維持するのは大変でしょう)。テストのために x と y を導入しましたが、アイデアは 1 つの変数でセット「a b」と「c d」を宣言することです。
ベストアンサー1
all=("$x" "$y")
との両方で、変数を二重引用符で囲む必要があります"${all[@]}"
。
x="a b"
y="c d"
echo "Attempt XX"
all=("$x" "$y")
for i in "${all[@]}" ; do
echo "$i"
done
その結果は次のようになります:
Attempt XX
a b
c d
次のように文字列を定義することもできます。
all=("a b" "c d")
for i in "${all[@]}" ; do
echo "$i"
done