基本的にはコンマ区切りの要素の文字列であるソースの変数があります。
SOURCES="a b c d e"
ユーザーにこのソースごとに1つの宛先を入力させたいので、この入力を上記のように見えるが宛先を含む文字列に保存したいと思います。 a = 1、b = 2 ...などを割り当てたい場合は、次のようになります:
echo $DESTINATIONS >>> "1 2 3 4 5"
上記を行うために、私はこれを行います:
SOURCES="a b c d e"
DESTINATIONS=""
for src in $SOURCES
do
echo Input destination to associate to the source $src:
read dest
DESTINATIONS=$DESTINATIONS $dest
done
ただし、echo
を$DESTINATIONS
、空っぽです。さらに、各ループで、私のシェルは私に言っています:
-bash: = **myInput**: command not found
私が間違っているところはありますか?
SOURCES="a b c d e"
DESTINATIONS=""
for src in $SOURCES
do
echo Input destination to associate to the source $src:
read dest
DESTINATIONS+=" ${dest}"
done
echo $DESTINATIONS
私のために働く。
区切り文字列ではなく、配列を使用する必要があります。
sources=(a b c d e)
for src in "${sources[@]}"
do
read -p "Input destination to associate to the source $src" dest
destinations+=( "$dest" )
done
printf '%s\n' "${destinations[@]}"
コードの最も明白な問題は次の行です:
DESTINATIONS=$DESTINATIONS $dest
むしろ、上の行は次のように書く必要があります。
DESTINATIONS="$DESTINATIONS $dest"
問題:$ destを実行し、DESTINATIONS = $ DESTINATIONSの環境を渡しています。うまくいけば、表示されているエラーメッセージについて説明できます。
私が提案した引用符を使用してコードを試してみましたが、問題なく機能します。
Q:何が問題なのですか?
A:必要に応じて引用符を使用しません。
引用符で囲まれていないスペースを使用すると、シェルは行を分割するために使用します。
使用する場合:
DESTINATIONS=$DESTINATIONS $dest
変数$ destは、シェルが実行するコマンドとして理解しているため、エラーが発生します。
-bash: = **myInput**: command not found
この問題を解決するには、スペースを引用してください。
それを行うにはいくつかの方法があります:
DESTINATIONS=$DESTINATIONS" "$dest
DESTINATIONS=$DESTINATIONS' '$dest
DESTINATIONS="$DESTINATIONS"' '"$dest"
DESTINATIONS="$DESTINATIONS $dest"
最後のオプションはおそらく最も単純であり、全体としては最良のものです。
次の構文も使用できます(bash 3.1-alpha1以降):
DESTINATIONS+=" $dest"
また、お願いします!他の拡張を引用してください:
echo "$DESTINATIONS"