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.但是我并没有真正理解解决方案,也无法看到我如何将它应用到我的案例中.我只是想让这个工作.
$(answer)不替换变量的值answer.它answer作为命令执行,并替换该命令的输出.你想要${answer}你到处都有$(answer).在这种情况下,你也可以裸露$answer,但过度使用${...}是很好的偏执狂.
(您是否习惯于编写Makefile? $(...)并且${...}在Makefile中是相同的,但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)