在循环中读取数组并忽略空格以使用换行符



我正在尝试使用"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' 
)

最新更新