簡體   English   中英

BASH:在while循環中讀取

[英]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是不同的。)

順便說一下,您還有一些其他錯誤:

  • 在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM