Bash shell脚本变量的使用
我来谈谈肉和骨头:Bash shell脚本变量的使用,bash,shell,variables,ksh,Bash,Shell,Variables,Ksh,我来谈谈肉和骨头: MY_VAR=6 until [$MY_VAR = 0] do dir/dir_$MY_VAR.log ps | grep "NAME_$MY_VAR.ksh" check some things if [results = ok] echo "program $MY_VAR sucessful" else echo "program $MY_VAR failure" MY_VAR = `expr $MY_VAR - 1` done 现在我得到了以下错误MY_VAR not
MY_VAR=6
until [$MY_VAR = 0]
do
dir/dir_$MY_VAR.log
ps | grep "NAME_$MY_VAR.ksh"
check some things
if [results = ok]
echo "program $MY_VAR sucessful"
else
echo "program $MY_VAR failure"
MY_VAR = `expr $MY_VAR - 1`
done
现在我得到了以下错误MY_VAR not found和[6:not found,所以我假设这是一个相当无意义的错误。我觉得逻辑足够合理,只是从声明中可能出现的两个错误来看,我在某处犯了一个简单的语法错误。您需要在
[
之后和]之前留一个空格
因为[
实际上是一个命令而不是分隔符
以下是用Bash(或ksh)重新编写的脚本:
然而:
for my_var in {6..1}
do
dir/dir_$my_var.log # I have no idea what this is supposed to be
ps | grep "NAME_$my_var.ksh"
# check some things
if [[ $results = ok ]]
then
echo "program $my_var successful"
else
echo "program $my_var failure"
fi
done
您的两个错误是由以下原因造成的:
直到[$MY\u VAR=0]
MY\u VAR=$(expr$MY\u VAR-1)
[6
(在扩展$MY_VAR
之后),而不是[
(查看一下/usr/bin/[
,它实际上是一个程序)。您还应该使用-eq
进行数字比较。=
在这里应该可以正常工作,但是前导零可以在数字比较可以工作的地方中断字符串比较:
until [ "$MY_VAR" -eq 0 ]
第二个问题是变量赋值中有空格。当您编写MY\u VAR=…
时,shell正在查找命令MY\u VAR
。而将其编写为:
MY_VAR=`expr $MY_VAR - 1`
这些答案直接回答了你的问题,但你应该研究丹尼斯·威廉姆森的答案,寻找更好的方法来做这些事情。的确,
[
是以/usr/bin/[/code>的形式存在的,但它也是一个shell内置,因此具有优先权。小心依赖于前导的零行为,[008-eq 8]
有效,但[[008-等式8]]
给出的值对于基本错误来说太大了。
无论如何都应该避免反勾号,使用$()
是首选。我得到了错误我的变量--:需要更多的令牌,您能否详细说明您的解决方案,例如(())和[[]]@Jewsef:在我的答案中使用哪个shell和哪个脚本版本的哪一行?需要注意的一点是,我更改了变量名的大小写,但前后不一致。这可能会造成一些问题。很抱歉,我已经修复了它。在Bash和ksh双方括号中。使用双括号进行数值比较例如,您可以使用==
和
,而不是丑陋的-eq
和-gt
。它还允许您执行算术运算,例如减量((my_var-))
显示。@Jewsef:我刚刚注意到您问题中的脚本缺少关闭if
的fi
。我将您的脚本复制到我的答案中,但没有修复(现在已修复)。这可能是您错误的根源。
MY_VAR=`expr $MY_VAR - 1`