Bash
嵌套讀取失敗
我有一個文件中的文件名列表,並且想讓使用者決定如何處理每個文件名。在 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 由於<tester
while 循環上的重定向而忙於文件輸入。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
之前確實需要一些東西=