如何使用脚本shell在同一行上显示多个元素?
我有一个元素数组,我想在同一行上显示该数组的所有元素:如何使用脚本shell在同一行上显示多个元素?,shell,Shell,我有一个元素数组,我想在同一行上显示该数组的所有元素: i=0 while read line do array[$i]= echo $line | tr '[A-Z]' '.' ((i+=1)) done k=0 while [ $k -lt $i ] do printf '%s ' ${array[$k]} ((k+=1)) done 这个程序的结果给了我换行符上的每个元素。我怎样才能让同一行上的所有元素用空格隔开?听起来你可以用tr来处理所有事情
i=0
while read line
do
array[$i]= echo $line | tr '[A-Z]' '.'
((i+=1))
done
k=0
while [ $k -lt $i ]
do
printf '%s ' ${array[$k]}
((k+=1))
done
这个程序的结果给了我换行符上的每个元素。我怎样才能让同一行上的所有元素用空格隔开?听起来你可以用
tr
来处理所有事情
tr A-Z . | tr '\n' ' '
如果不重新排序数组,则将行读入数组毫无意义
还要注意,tr
如何不读取正则表达式参数,只读取两个字符范围列表
如果要保留最后一个换行符,请使用管道将其恢复到sed
:
... | sed 's/ $/\n/'
(在sed
脚本中包含换行符的表示法不是完全可移植的,但我相信这应该适用于任何合理的现代平台。)
这些基本管道应在任何壳体中工作。你的脚本一点也不像
csh
脚本。printf
应该是这样工作的,但是您没有正确初始化数组(如果是,循环将是多余的)。如果您使用的是bash
4或更高版本,您可以在两行中填充数组,而无需外部命令:
readarray -t array
array=("${array[@]//[A-Z]/.}")
在早期版本的bash
中,仍然需要循环:
while IFS= read -r line; do
array+=( "${line//[A-Z]/.}" )
done
在任何一种情况下,都可以使用
printf '%s\n' "${array[*]}"
你真的在使用吗?您的第二个
while
循环将在第一个循环实际正确填充数组时找到。您看到的输出来自第一个循环,而不是第二个循环。