Bash

嵌套讀取失敗

  • November 28, 2013

我有一個文件中的文件名列表,並且想讓使用者決定如何處理每個文件名。在 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

首先,錯誤[是因為answer是空的,所以[看到三個參數=y]。始終在變數替換周圍加上雙引號:if [ "$answer" = "y" ].

原因$answer是空 fd 0 由於<testerwhile 循環上的重定向而忙於文件輸入。

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

試試if [ x${answer} = "xy" ];test之前確實需要一些東西=

引用自:https://unix.stackexchange.com/questions/65955