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