[英]BASH: read in while loop
while [ $done = 0 ]
do
echo -n "Would you like to create one? [y/n]: "
read answer
if [ "$(answer)" == "y" ] || [ "$(answer)" == "Y" ]; then
mkdir ./fsm_$newVersion/trace
echo "Created trace folder in build $newVersion"
$done=1
elif [ "$(answer)" == "n" ] || [ "$(answer)" == "N" ]; then
$done=2
else
echo "Not a valid answer"
fi
done
好的,所以我上面有一個簡單的bashscript,它只是嘗試從用戶那里獲取輸入並進行驗證。 但是我不斷收到這個錯誤
./test.sh: line 1: answer: command not found
./test.sh: line 1: answer: command not found
./test.sh: line 1: answer: command not found
./test.sh: line 1: answer: command not found
我不知道為什么,因為“答案”不在第1行附近。所以我遇到了這篇文章
這很有意義,因為它指的是第1行,找不到答案。 因此,它似乎正在開始一個新的子Shell。 但是,我不太了解該解決方案,也看不出如何將其應用於我的案子。 我只是想讓它工作。
$(answer)
不能替代變量answer
的值。 它執行answer
作為命令,並替換該命令的輸出。 您希望在有$(answer)
任何地方都有${answer}
。 在這種情況下,您也可以擺脫裸露的$answer
,但是過度使用${...}
是個好主意。
(您可能曾經編寫過Makefile嗎? $(...)
和${...}
在Makefile中是相同的,但是shell是不同的。)
順便說一下,您還有一些其他錯誤:
$done=1
更改$done=1
just done=1
,類似地,將$done=2
更改$done=1
。 mkdir
命令和while
循環中的條件。 test
參數還不夠偏執(又名[
)。 您需要在等式測試的兩邊都加上x
前綴,以免將它們誤解為開關。 ==
不是可移植的shell,請改用=
(bash沒什么區別,但是許多非bash的shell根本不支持==
)。 放在一起,這就是您的腳本應如下所示:
while [ "x${done}" = x0 ]; do
echo -n "Would you like to create one? [y/n]: "
read answer
if [ "x${answer}" = xy ] || [ "x${answer}" = xY ]; then
mkdir "./fsm_${newVersion}/trace"
echo "Created trace folder in build $newVersion"
done=1
elif [ "x${answer}" = xn ] || [ "x${answer}" = xN ]; then
done=2
else
echo "Not a valid answer"
fi
done
我不知道為什么,因為“答案”不在第1行附近。所以我遇到了這篇文章
這不是你的問題。
我運行了腳本,但沒有得到您得到的錯誤。 我確實收到了錯誤:
./test.sh: line 1: [: -eq: unary operator expected
當我嘗試編譯時。 定義完成解決了這個問題。 以下腳本應該可以工作...
#!/bin/bash
done=0
while [ $done -eq 0 ]
do
echo -n "Would you like to create one? [y/n]: "
read answer
if [[ "$(answer)" == "y" || "$(answer)" == "Y" ]]; then
mkdir ./fsm_${newVersion}/trace
echo "Created trace folder in build $newVersion"
$done=1
elif [[ "$(answer)" == "n" || "$(answer)" == "N" ]]; then
$done=2
else
echo "Not a valid answer"
fi
done
...請注意,您正在對您的done變量進行字符串比較,這顯然是數字的。 盡管可以工作,但對數字類型變量進行字符串比較通常是一種不好的形式。 使用-eq(算術比較運算符)代替。 (還請注意,如果您保留該測試,則字符串相等性將不一致……您在一個位置上有“ =”,在另一位置上有“ ==” ...在這里挑剔,但保持一致很有幫助)。
另外,對於復合條件,我建議使用雙括號,因為如果您使用更長的括號,它們將更易讀。 例如
if [[($var1 -eq 0 && $var2 -eq 1) || ($var1 -eq 1 && $var2 -eq 0)]]; then
只是一個偏愛,因為您只有兩個條件,但將來可能會有用。
另外,您在newVersion變量周圍缺少大括號'{''}'。
最后,我建議將#!/ bin / bash行放在腳本頂部。 否則,由您的環境決定如何處理腳本,這是一個壞主意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.