我正在尝试使用bash读取文件的一部分并停止和特定行.我对bash不是很熟悉,但我一直在阅读手册和各种参考资料,我不明白为什么类似下面的东西不起作用(但会产生语法错误):
while { read -u 4 line } && (test "$line" != "$header_line")
do
echo in loop, line=$line
done
Run Code Online (Sandbox Code Playgroud)
我想我可以写一个测试"完成"变量的循环,然后在循环中进行我的实际测试并适当地设置"完成",但我很好奇1)为什么以上不起作用,2)是有一些小的修正可以使它工作?我仍然相当困惑何时使用[,(,{,或((因此,或许其他一些组合可能会起作用,尽管我已尝试了几种.
(注意:当我在循环上面调用它时,"read -u 4 line"工作正常.我在文件描述符4上打开了一个文件.)
我想你想要的更像是这样的:
while read -u 4 line && test "$line" != "$header_line"
do
...
done
Run Code Online (Sandbox Code Playgroud)
大括号({}字符)用于在不能使用空格时将变量与字符串的其他部分分开.例如,echo "${var}x"将打印变量的值var后跟a x,但echo "$varx"会打印变量的值varx.
括号([]字符)用作test程序的快捷方式.[是另一个名称test,但当test检测到它被调用时,[它需要一个]作为它的最后一个参数.关键是清晰.
括号(()字符)用于许多不同的情况.它们通常会启动子壳,但并不总是(我不确定#3):
(echo "Hi" ; echo "Bye") | sed -e "s/Hi/Hello/"将打印两行"Hello"和"Bye".这是获取多个echo语句以生成单个流的最简单方法.$(expr 1 + 1)将像一个变量,但会产生值2.$((5 * 4 / 3 + 2 % 1))将像变量一样进行评估,但会计算该数学表达式的结果.