BASH:while循环读入

Alb*_*ish 0 bash loops

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
Run Code Online (Sandbox Code Playgroud)

好的,我上面有这个简单的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
Run Code Online (Sandbox Code Playgroud)

我不明白为什么,因为"回答"远不及第1行.所以我遇到了这篇文章

这是有道理的,因为它指的是第1行而无法找到答案.所以它似乎开始了一个新的子shell.但是我并没有真正理解解决方案,也无法看到我如何将它应用到我的案例中.我只是想让这个工作.

zwo*_*wol 7

$(answer)不替换变量的值answer.它answer作为命令执行,并替换该命令的输出.你想要${answer}你到处都有$(answer).在这种情况下,你也可以裸露$answer,但过度使用${...}是很好的偏执狂.

(您是否习惯于编写Makefile? $(...)并且${...}在Makefile中是相同的,但shell是不同的.)

顺便说一句,你有一些其他的错误:

  • 在shell中,您不要在赋值左侧的变量名称上放置美元符号.你需要改为$done=1公正done=1和类似的$done=2.
  • 对于你的变量替换你并不是很偏执.除非你知道它在某些特定情况下做错了,你应该总是用双引号包装所有变量替换.这会影响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
Run Code Online (Sandbox Code Playgroud)