for
示例:您通常以水平布局列出 shell 命令中的值:
for var in 0 1 2 3 4 5 6 7 8 9
do
echo $var
done
出于版本控制和可读性目的,最好将每个列表项放在单独的行中。这可能吗?
无论有没有 ,您都无法执行以下操作\r\n
:
for var in
0
1
2
3
4
5
6
7
8
9
do
echo $var
done
有趣的是,这几乎有效(无论单引号还是双引号都相同):
for var in
'0
1
2
3
4
5
6
7
8
9'
do
echo $var
done
输出:
-bash: demo.sh: line 11: syntax error near unexpected token ` '0
1
2
3
4
5
6
7
8
9''
-bash: demo.sh: line 11: ` 9''
这确实不是有效,无论是单引号还是双引号。
for var in
"0"
"1"
"2"
"3"
"4"
"5"
"6"
"7"
"8"
"9"
do
echo $var
done
答案1
尝试一下这个测试版本:
#!/bin/bash --
for var in \
1 \
2 \
3 \
4 \
6 \
; do
printf "%s\n" "${var}"
done
循环默认将包含(空格) 和for
的字符串拆分为单独的元素。\n
'
在您的循环中使用for
指示 shell(在您的版本中)将参数视为一个单一值,即包含多行的字符串。
考试:
$ ./list.sh
1
2
3
4
6
第一个版本供参考:
#!/bin/bash --
listint='
1
2
3
4
6
'
for var in ${listint} ; do
printf "%s\n" "${var}"
done
允许'
定义多行字符串,包括\n
。
答案2
这是一种结合了各部分内容的方法Jay Jargot 的回答:
#!/bin/bash
data=(
"too hot" # Papa bear
"too cold" # Mama bear
"just right" # Baby bear
)
for var in "${data[@]}"
do
printf "%s\n" "$var"
done
这将创建一个数据数组。
这具有以下优点:
- 您可以对数据发表评论。
- 您可以在数据中放置空行。(您可以用 Jay 答案的第一部分来做到这一点,但它必须是
\
,而不是实际的空行。您可以直接用 Jay 答案的第二部分来做到这一点。) - 值中可以包含空格。(你可以用 Jay 的答案的第一部分来做到这一点,但不能用第二部分。)
- 您可以多次使用数据(即,您可以
for var in "${data[@]}"
在脚本中有多个循环,而不必重复数据)。(您可以使用 Jay 答案的第二部分来做到这一点,但不能使用第一部分。) - 您可以在行尾添加空格。(如果您在 Jay 的答案的第一部分中的反斜杠后添加空格,它将失败,并且原因可能很难调试。)
我的答案的缺点:
- 它并非在所有 shell 中都有效。(但它在 bash、ksh 以及其他一些 shell 中有效。)
- 语法
"${data[@]}"
很复杂,很难记住。