Bash:是否可以在新行上声明每个列表项?

Bash:是否可以在新行上声明每个列表项?

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[@]}"很复杂,很难记住。

相关内容