Bash 如何在shell脚本中使用空格将行分隔为数组

Bash 如何在shell脚本中使用空格将行分隔为数组,bash,shell,Bash,Shell,我不明白为什么我的脚本没有显示用空格分隔的字符串 这是我的代码: While read -r row do line = ($row) for word in $line do echo ${word[0]} done done < $1 这项工作很好: while read -r row do echo $row | awk '{print $1}' done 在读取-r行时请求用户输入并将其存储在行变量中,awk'{print$1}'只

我不明白为什么我的脚本没有显示用空格分隔的字符串

这是我的代码:

While read -r row
do

   line = ($row)
   for word in $line
   do 
       echo ${word[0]}
   done
done < $1
这项工作很好:

while read -r row
do
  echo $row | awk '{print $1}'
done

在读取-r行时
请求用户输入并将其存储在
变量中,
awk'{print$1}'
只显示用户输入的第一个字。

是否希望每个令牌都在单独的行上?为什么不直接使用
sed

$ echo "1 2 3 hi" | sed -r 's/[ \t]+/\n/g'
1
2
3
hi
如果您想要每行的第一个单词,那么:

$ echo "1 2 3 hi" | sed -r 's/^([^ \t]+).+/\1/'
1
如果是文件,则删除“echo…|”,并将文件名作为参数提供给sed:

$ sed -r 's/^([^ \t]+).+/\1/' file.txt
这将尝试运行名为
的命令,而
,您可能会因此而出错。shell关键字是

do    
   line = ($row)
这将尝试运行名为
line
的命令,这是一个来自GNU coreutils的程序(
line-read one line
),但可能不是您想要的。shell中的赋值不能在等号周围有空格

如果该赋值有效,它将生成一个名为
line
的数组

   for word in $line
仅按名称引用数组会扩展到数组的第一项,因此循环在这里是无用的

   do 
       echo ${word[0]}
在这里,索引不是很有用,因为
word
将是单个值,而不是数组

我想你想要的是:

while read -r row ; do 
    words=($row);
    echo "${words[0]}"
done
虽然如果
$row
包含像
*
这样的全局字符,它们将被扩展为匹配的文件名

这样会更好:

read -r -a words
echo "${words[0]}"
或者干脆

read -r line
echo "${line%% *}"     # remove everything after the first space

不,我不接受用户的输入,这些行来自另一个文件。文件就是参数。
read -r -a words
echo "${words[0]}"
read -r line
echo "${line%% *}"     # remove everything after the first space