web-dev-qa-db-ja.com

ループ中の文字列の入力を連結する

基本的にはコンマ区切りの要素の文字列であるソースの変数があります。

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

私が間違っているところはありますか?

6
Matteo NNZ
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

私のために働く。

5
dutiona

区切り文字列ではなく、配列を使用する必要があります。

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[@]}"
4
chepner

コードの最も明白な問題は次の行です:

DESTINATIONS=$DESTINATIONS $dest

むしろ、上の行は次のように書く必要があります。

DESTINATIONS="$DESTINATIONS $dest"

問題:$ destを実行し、DESTINATIONS = $ DESTINATIONSの環境を渡しています。うまくいけば、表示されているエラーメッセージについて説明できます。

私が提案した引用符を使用してコードを試してみましたが、問題なく機能します。

2
Mark

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"
1
Isaac