我正在尝试使用"for"循环加载一个包含数组的变量"$LIST"。然而,我不希望它们在空格处分开,而是在新行的点上。我怎样才能得到这种效果?
LIST=(
"1" "Some text" "ON"
"2" "Some text" "OFF"
"3" "Some text. Some text" "ON"
"4" "Some text" "OFF"
"5" "Some text. Some text" "OFF"
)
for ENTRY in "${LIST[@]}"
do
echo "$ENTRY"
done
我目前得到以下结果:
1
Some text
ON
2
Some text
OFF
3
Some text. Some text
ON
4
Some text
OFF
5
Some text. Some text
OFF
我想得到这个:
1 Some text ON
2 Some text OFF
3 Some text. Some text ON
4 Some text OFF
5 Some text. Some text OFF
只需使用printf
:
$ printf '%s %s %sn' "${LIST[@]}"
1 Some text ON
2 Some text OFF
3 Some text. Some text ON
4 Some text OFF
5 Some text. Some text OFF
只要没有消耗完所有参数,printf
就会迭代。
首先,您不需要使用换行反斜杠来排列列表数组的声明。
其次,未导出的变量最好是完全小写的。
按3个元素的组迭代您的列表/数组;将数组元素作为参数传递给函数可以执行您想要的操作。
#!/bin/bash
list=(
"1" "Some text" "ON"
"2" "Some text" "OFF"
"3" "Some text. Some text" "ON"
"4" "Some text" "OFF"
"5" "Some text. Some text" "OFF"
)
do_output () {
# iterates while there are still arguments
while [ $# -gt 0 ]
do
# prints 3 arguments
printf '%s %s %sn' "$1" "$2" "$3"
# shifts to the next 3 arguments
shift 3
done
}
do_output "${list[@]}"
将每一行放在引号中,而不是每个单词。您可以在应该作为描述的多个单词的字符串周围添加双引号。
LIST=(
'1 "Some text" ON'
'2 "Some text" OFF'
'3 "Some text. Some text" ON'
'4 "Some text" OFF'
'5 "Some text. Some text" OFF'
)