2016-09-16 6 views
0

は、私は、文字列シェルのリストをループする方法は?

string1 
string2 
string3 
. 
. 
stringN 

のリストを出力コマンドがあるとどのようにすることができますシェルで、リストのスルー出力Iループ?例えば

myVal=myCmd 
for val in myVal 
    do 
    # do some stuff 
    end 

(私は...プログラミングシェルに非常に新しいです)

答えて

3

bashwhile-loopを使用して、ループがコマンドまたは入力ファイル上で行うことができます。例で

while IFS= read -r string 
do 
    some_stuff to do 
done < <(command_that_produces_string) 

、Iは

$ cat file 
My 
name 
is not 
relevant 
here 

として内容のサンプル・ファイルを持っている私はそれがファイルを介して読み出すよう

$ cat script.sh 
#!/bin/bash 
while IFS= read -r string 
do 
    echo "$string" 
done < file 

が生産ラインをエコーするスクリプトを変更しました実行時のo/p ./script.sh

My 
name 
is not 
relevant 
here 

同じことをbash-commandで行うこともできます。ここではprocess-substitution (<())を採用して、サブシェルでコマンドを実行します。

#!/bin/bash 

while IFS= read -r -d '' file; do 
    echo "$file" 
done < <(find . -maxdepth 1 -mindepth 1 -name "*.txt" -type f -print0) 

上記の単純なfindリスト(スペース/特殊文字を使用したものを含む)、現在のディレクトリのすべてのファイル。ここで、findコマンドの出力は、while-loopによって解析されるstdinに供給されます。

+1

優れた答えを注意してください。私が不平を言うために見つけることができる唯一のことは、専門用語であるが実際にコードではないもののコードフォーマット(バッククォート)の使用です。 –

+1

[このメタ・ディスカッション](http://meta.stackexchange.com/questions/135112/inline-code-spans-should-not-be-used-for-emphasis-right)、on-point re:を参照してくださいケースはコードスパンのフォーマットに適しており、適切ではありません。 –

+0

@CharlesDuffy:本当にありがとう、私の答えを奨励!時間が経つにつれて回答のフォーマットを最適化する方法について専門家から学んできました。将来必ずそれらを修正します。 – Inian

-1

あなたは、非常に接近しているそれはちょうどカットし、問題の原因となっているペースト/タイプミスがされた場合に言うことができない - ライン1上の引用符とラインで$ 2

myVal=`echo "a b c"` 
for val in $myVal 
do 
    echo "$val" 
done 
+0

これは 'abc'と' a'、 'b'と' c'の行を3つの異なる行で区別できません。 –

+0

また '*'をカレントディレクトリのファイルのリストで置き換えます。 –

+0

さらに、 '* $ 'が' $ myVal'で展開されている場合、*自体*がglobとして扱われる結果になる場合は、 'echo $ val'の中で*もう一度*起こりますそこ。 –

関連する問題