bashシェルスクリプトで、文字列値を反復処理するforループを記述する


24

bashでは、forループ制御変数iが指定された整数を反復するループを書くことができることを知っています。たとえば、1〜10の整数を出力するbashシェルスクリプトを作成できます。

#!/bin/bash

for i in {1..10}
do
 echo $i
done

文字列のリストを提供する場合、文字列であるループ制御変数を代わりに反復することは可能ですか?たとえばfname、ファイル名を表す文字列があるとします。ファイル名ごとに一連のコマンドを呼び出します。たとえばfname、次のようなコマンドを使用した内容を印刷したい場合があります。

#!/bin/bash

for fname in {"a.txt", "b.txt", "c.txt"}
do
 echo $fname
done

言い換えると、最初の反復でfnameは値fname="a.txt"を持ち、2番目の反復でfnameは値を持つ、というfname="b.txt"ようになります。残念ながら、上記の構文はまったく正しくないようです。出力を取得したい:

a.txt

b.txt

c.txt

しかし、上記のコードを試すと、次の出力が得られます。

{a.txt、

b.txt、

c.txt}

変数の値/内容を繰り返し変更できるように、正しい構文を決定するのを手伝ってもらえますfnameか?お時間をいただきありがとうございます。


5
削除{}、あなたは(スペース区切り)リストをループには何も必要ありません
マット

3
手段@Mat削除{} および,秒。別の方法は、スペースを削除することです。"a.txt" "b.txt" "c.txt"またはのいずれか{"a.txt","b.txt","c.txt"}です。しかし、{a..c}.txt代わりに私は好む。
マナトワーク

回答:


39

正しい構文は次のとおりです。

#!/bin/bash

for fname in a.txt b.txt c.txt
do
  echo $fname
done

9
また、名前の配列を想定してfnames=( a.txt b.txt c.txt )、構文を使用できますfor f in ${fnames[@]}; do echo $f; done

1
それが事実であるfor fname in a.txt b.txt c.txtfor fname in "a.txt" "b.txt" "c.txt"同じ結果が得?
アンドリュー

アンドリュー、はい、本当です。彼らは、同じ結果が得られます
アリGangji

1
もちろん、値に空白が含まれる可能性がある場合はfor f in "${fnames[@]}"; do echo $f; done(を引用符で囲んで${fnames[@]})使用する必要fnamesがあります。"$f"特にを使用する必要があります。特に、echo(たとえば、catまたはcp)より高度な操作を行う場合。(そして、あなたがやっているだけでも、代わりechoに使うべきprintfです。)
スコット

@ user13742も回答に記載する必要があると思います。
Fallenreaper

1

私はあなたがするべきだと思う...

printf %s.txt\\n a b c

OPには、彼が行われる前にエコーする以外のことを念頭に置いている可能性がありますが、私はこれが好きです。
オタク長老

0

コメントの user13742に記載されているようにbashおよびの配列を使用できますksh

#!/usr/bin/env bash

files_list=( "a.txt" "b.txt" "c and space.txt" )

for i in "${files_list[@]}"
do
    echo "$i"
    # do something else here,maybe
done

そしてそのように動作します:

$ ./iterate_files_array.sh                                                      
a.txt
b.txt
c and space.txt

ただし、dash/bin/shUbuntuの)などの一部のシェルは配列をサポートしません。そのような場合、ヒアドキュメント構造の使用に頼ることができます。<<

#!/bin/sh

while IFS= read -r line
do
    echo "$line"
done << EOL
one.txt
two.txt
with space.txt
EOL
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.