如何使用脚本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
循环将在第一个循环实际正确填充数组时找到。您看到的输出来自第一个循环,而不是第二个循环。