我在文件中有一个文件名列表,想让用户决定如何处理每个文件名。在 bash 中,迭代文件名本身并不简单,所以我遵循这个答案:
#!/bin/bash
while IFS= read -r THELINE;
do
read -n 1 -p "Print line? [y/n] " answer;
if [ ${answer} = "y" ];
then
echo "${THELINE}";
fi;
done < tester;
当我尝试执行此操作(在非空文件上)时,出现以下错误if
:
line 5: [: =: unary operator expected
我最好的猜测是answer
设置不正确,这可能是由于以read
“嵌套”方式使用两次调用引起的,因为以下内容按预期工作:
#!/bin/bash
for THELINE in $(cat "tester");
do
read -n 1 -p "Print line? [y/n] " answer;
if [ ${answer} = "y" ];
then
echo "${THELINE}";
fi;
done;
这里发生了什么?
我继续bash 4.2.24(1)-release (x86_64-pc-linux-gnu)
跑3.2.0-37-generic #58-Ubuntu x86_64 GNU/Linux
。
答案1
首先,错误[
is 因为answer
是空的,所以[
看到三个参数:=
、y
和]
。始终在变量替换两边加上双引号:if [ "$answer" = "y" ]
。
原因是空 fd 0 由于while 循环上的$answer
重定向而忙于文件输入。<tester
while IFS= read -r line <&3
do
read -n 1 -p "Print line? [y/n] " answer
if test "$answer" = "y"
then
echo "$line"
fi
done 3< tester
答案2
尝试if [ x${answer} = "xy" ];
。test
之前确实需要一些东西=