スペースを含む文字列のセットをループする 質問する

スペースを含む文字列のセットをループする 質問する

「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

おすすめ記事