bash遍历字符串列表


13

是否可以格式化此样本:

for i in string1 string2 stringN
do
 echo $i
done

类似于以下内容:

for i in 
string1
string2
stringN
do
 echo $i
done

编辑:对不起,混乱,并没有意识到,有执行脚本的不同方法-上海<scriptname>bash <scriptname>和也这件事情,我现在不能名字- #!/bin/sh#!/bin/bash:)


您要解决的问题是什么?
jesse_b

您是否尝试过要问的内容以查看是否可行?
DopeGhoti

@Jesse_b一串字符串的可读性和可管理性

@DopeGhoti是的,我做到了

@waayee:在这种情况下,数组是您最好的选择。请参阅Glenn Jackman的答案。
jesse_b

Answers:


33

在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认为我现在明白了-必须运行“ bash <脚本名称>”而不是“ sh <

@waayee,或放置适当的hashbang / shebang行并将其像可执行文件一样运行。必读:shebang是否确定运行脚本的shell?
ilkkachu

1
@rrrrr,您的问题可能在这里得到解答:stackoverflow.com/q/12314451/7552
格伦·杰克曼(Glenn jackman)

4

您可以使用反斜线转义换行符:

$ for i in \
> hello \
> world
> do
> echo $i
> done
hello
world
$

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


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

您缺少分号!
1754年

请注意,只要每个字符串都是一个单独的单词,这将起作用。字符串中一旦有空格,空格就会将字符串分成多个单词。另外,如果$list字符串包含文件名通配符(list='* * * *'),则外壳程序可能会将它们替换为匹配的文件名。
库沙兰丹

0

您可以使用此处loop提供的命令,如下所示:

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

或者,如果您有一个列表作为文件:

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

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}
αғsнιη
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.