Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在bash中读取只有一行的文件_Linux_Bash_File - Fatal编程技术网

Linux 在bash中读取只有一行的文件

Linux 在bash中读取只有一行的文件,linux,bash,file,Linux,Bash,File,我使用下面的代码在bash中逐字读取文件 while read line; do for word in $line; do echo "word = '$word'" done done < My_File 读行时;做 对于$line中的单词;做 echo“word=“$word” 完成 完成

我使用下面的代码在bash中逐字读取文件

while read line; do
    for word in $line; do
    echo "word = '$word'"
    done
done  < My_File
读行时
;做
对于$line中的单词;做
echo“word=“$word”
完成
完成<我的文件
但是,上面的代码不起作用,因为
My_File
只有一行。我应该如何修改代码

读入数组 这会将一行读取到数组中,并根据IFS中的字符进行拆分(默认情况下,空格制表符和换行符)


word=${word%$'\n'}
如果您的文件格式不完全符合(仅限空格分隔符)给定的格式,则会删除可能出现的任何换行符。

您可以这样调整代码,以考虑没有终止换行符的行:

(cat My_File; echo ) | while read line; do
    for word in $line; do
    echo "word = '$word'"
    done
done
这将在输入的末尾添加一个换行符,无论My_文件是否有换行符,它都不会更改输出


-Rich Alloway(RogueWave)

问题中的代码实际上应该可以工作,即使外部循环只迭代一次。。。除非,也许,您的一行实际上没有被换行符终止(在这种情况下,
read
将返回false,因此循环体将不会运行)。我应该在哪里将我的文件交给第二个代码
done
?@Admia,是的,完全正确。请注意,第一个解决方案显示的问题与OP代码中的问题相同,当最后一行(或唯一一行)没有换行符终止时,它将不会处理,这似乎是问题所在。@JavierVilla,您自己试试:
read-a line<@JavierVilla,…在这种情况下,我们没有无条件地需要
| |(${line[@]}))
之类的原因是,除非用户使用
set-e
或类似工具,否则在
读取的退出状态上实际上没有分支。这是相当大的开销(forking设置管道,forking作为外部命令运行
cat
),并对作用域有副作用(管道退出时循环中的变量更改消失,如中所述)。我强烈建议在读取第| |[$line]行时使用
相反,“
for word in$line”
不仅仅是进行字符串拆分,而是进行全局扩展:如果文件包含
*
,那么将要回显的不是
word='*'
,而是当前目录中每个文件的
word='filename'
结果列表。
while IFS='' read -r -d ' ' word; word=${word%$'\n'}; [[ $word ]]; do
  echo "Read word: $word"
done <My_File
(cat My_File; echo ) | while read line; do
    for word in $line; do
    echo "word = '$word'"
    done
done