3

bash では、定義した文字列のリストをループするスクリプトを頻繁に作成します。

例えば

for a in 1 2 3 4; do echo $a; done

ただし、リストを(ループの前にきれいに保つために)定義して、スペースが含まれ、別のファイルがないようにしたいと思います。

例 (ただし、これは機能しません)

read -r VAR <<HERE
list item 1
list item 2
list item 3
...
HERE

for a in $VAR; do echo $a; done

上記の予想される出力(私が望む):

list item 1
list item 2
list item 3
etc...

しかし、あなたは得るでしょう:

list
item
1

配列を使用できますが、配列内の各要素にインデックスを付ける必要があります(配列に追加できるため、以下の回答を編集してください..できるとは知りませんでした)。

別のファイルを使用せずに、他の人はどのように bash でリストを宣言的に定義しますか?

申し訳ありませんが、ファイルの先頭でfor ループ ロジックの前にリストを定義したいということを忘れていました。

4

5 に答える 5

4

次のように「HEREドキュメント」を使用できます。

while read a ; do echo "Line: $a" ; done <<HERE
123 ab c
def aldkfgjlaskdjf lkajsdlfkjlasdjf
asl;kdfj ;laksjdf;lkj asd;lf sdpf -aa8
HERE
于 2012-05-21T14:42:57.600 に答える
3
while read -r line
do
    var+=$line$'\n'
done <<EOF
foo bar
baz qux
EOF

while read -r line
do
    echo "[$line]"
done <<<"$var"

配列にインデックスを付ける必要があるのはなぜですか? 配列に追加して、インデックスを使用せずに反復処理できます。

array+=(value)
for item in "${array[@]}"
do
    something with "$item"
done
于 2012-05-21T14:50:29.183 に答える
3

配列の使用はそれほど難しくありません。

readarray <<HERE
this is my first line
this is my second line
this is my third line
HERE

# Pre bash-4, you would need to build the array more explicity
# Just like readarray defaults to MAPFILE, so read defaults to REPLY
# Tip o' the hat to Dennis Williamson for pointing out that arrays
# are easily appended to.
# while read ; do
#    MAPFILE+=("$REPLY")
# done

for a in "${MAPFILE[@]}"; do
    echo "$a"
done

これには、必要に応じて、各リスト項目にスペースを含めることができるという追加の利点があります。

于 2012-05-21T14:46:50.040 に答える
2

ここにはより良い答えがありますが、読み取りを区切り、環境変数を使用してループ内\nの空白の代わりに変数を一時的に改行で分割するように変更することもできます。forIFS

read -d \n -r VAR <<HERE
list item 1
list item 2
list item 3
HERE

IFS_BAK=$IFS
IFS="\n"
for a in $VAR; do echo $a; done
IFS=$IFS_BAK
于 2012-05-21T14:58:21.877 に答える
0

whileループの代わりにループを使用しても問題ない場合は、構文と「ヒア ドキュメント」forを使用できます。while read

#!/bin/bash

while read LINE; do
    echo "${LINE}"
done << EOF
list item 1
list item 2
list item 3
EOF

ref: ` cat << EOF` は bash でどのように機能しますか?

于 2012-05-21T14:46:21.603 に答える