文字列のリストによるbashループ


13

このサンプルをフォーマットすることは可能ですか?

for i in string1 string2 stringN
do
 echo $i
done

これに似たものに:

for i in 
string1
string2
stringN
do
 echo $i
done

編集:混乱を招いて申し訳ありませんが、スクリプトを実行するさまざまな方法があることを理解していませんでした-sh <scriptname>bash <scriptname>、今私が名前を付けることができないこのこと- #!/bin/sh#!/bin/bash:)


解決しようとしている問題は何ですか?
jesse_b

それが機能するかどうかを確認するために、求めていることを試しましたか?
DopeGhoti

@Jesse_b一連の文字列の可読性と管理性

@DopeGhotiはい、私はやりました

@waayee:その場合、配列が最善の策です。グレン・ジャックマンの答えを見てください。
jesse_b

回答:


32

bashで配列を使用すると、読みやすくなります。この配列構文では、単語間に任意の空白を使用できます。

strings=(
    string1
    string2
    "string with spaces"
    stringN
)
for i in "${strings[@]}"; do
    echo "$i"
done

1
これは最もエレガントに見えますが、残念ながらエラーが発生します:構文エラー: "("予期しない

1
@waayee、それではBashで実行していません。これshは必ずしもBashである必要はなく、特にDebianやUbuntuではないことに注意してください。
ilkkachu

1
@ilkkachu私は今それを得たと思います-"sh <scriptname>"ではなく "bash <scriptname>"を実行する必要があります:)

@waayee、または適切なhashbang / shebang行を配置して、実行可能ファイルのように実行します。必要な読み物:シバンはスクリプトを実行するシェルを決定しますか?
ilkkachu

1
@rrrrr、あなたの質問はおそらくここで答えられます:stackoverflow.com/q/12314451/7552
glenn jackman


2

ループする各項目の前後で改行をエスケープできます。

for i in \
    string1 \
    string2 \
    stringN
do
   printf '%s\n' "$i"
done

または、この簡単な例の場合:

printf '%s\n' string1 string2 stringN

同じ結果になります。

関連:

bash配列を使用したバリエーション:

strings=(
    string1
    string2
    stringN
)

printf '%s\n' "${strings[@]}"


0

次のようなloopコマンドを使用できます

$ loop "echo $ITEM" --for string1,string2,string3

または、ファイルとしてリストがある場合:

$ cat file_list.txt | loop "echo $ITEM"

0
list='a b c d'
for element in $list;do 
    echo "$element"
done

セミコロンがありません!
41754

これは、各文字列が個別の単語である限り機能することに注意してください。文字列にスペースがあるとすぐに、スペースによって文字列が複数の単語に分割されます。また、$list文字列にファイル名の展開文字(list='* * * *')が含まれている場合、シェルはこれらを一致するファイル名に置き換える可能性があります。
クサラナンダ

0

同じこと、少ないテキスト:

array=(
        string{1..7}
)

for i in "${array[@]}"; do
    echo "$i"
done

string1などは、表示されるリテラル値ではなく、プレースホルダーであるため、このアプローチは機能しません。
Stephen Kitt

もしそうなら、なぜわざわざarray ( … )?ただするfor i in string{1..7}; do echo "$i"; done; 偶数printf '%s\n' string{1..7}
–αJansнιη
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.