use*_*118 166 command-line bash scripts
我正在尝试for
为文件运行一个循环,我想显示整行。但它只显示最后一个字。我想要完整的线路。
for j in `cat ./file_wget_med`
do
echo $j
done
Run Code Online (Sandbox Code Playgroud)
运行后结果:
Found.
Run Code Online (Sandbox Code Playgroud)
这是我的数据:
$ cat file_wget_med
2013-09-11 14:27:03 ERROR 404: Not Found.
Run Code Online (Sandbox Code Playgroud)
Rad*_*anu 239
for
当循环看到空格、制表符或换行符等任何空白时,它就会拆分。因此,您应该使用IFS(内部字段分隔符):
IFS=$'\n' # make newlines the only separator
for j in $(cat ./file_wget_med)
do
echo "$j"
done
# Note: IFS needs to be reset to default!
Run Code Online (Sandbox Code Playgroud)
evi*_*oup 109
for
默认情况下,循环在任何空格(空格、制表符、换行符)上拆分;一次处理一行的最简单方法是使用while read
循环代替,它在换行符处拆分:
while read i; do echo "$i"; done < ./file_wget_med
Run Code Online (Sandbox Code Playgroud)
我希望你的命令每行吐出一个单词(这是我用我自己的文件测试它时发生的情况)。如果发生其他事情,我不确定是什么原因造成的。
小智 21
#!/bin/bash
files=`find <subdir> -name '*'`
while read -r fname; do
echo $fname
done <<< "$files"
Run Code Online (Sandbox Code Playgroud)
经过验证的工作,不是您可能想要的一种衬里,但不可能优雅地这样做。
这是 Mitchell Currie 答案的一个轻微扩展,我喜欢它,因为副作用的范围很小,避免了必须设置变量:
#!/bin/bash
while read -r fname; do
echo $fname
done <<< "`find <subdir>`"
Run Code Online (Sandbox Code Playgroud)
小智 6
我会这样写:
cat ./file_wget_med | while read -r j
do
echo $j
done
Run Code Online (Sandbox Code Playgroud)
因为它需要对原始脚本进行最少的更改(使用 的解决方案除外IFS
,但它bash
不仅修改此循环控制语句的行为)。