Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash shell脚本变量的使用_Bash_Shell_Variables_Ksh - Fatal编程技术网

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)
[我使用$()而不是backticks,因为我无法将backticks放入代码部分]

第一个问题是两端的方括号缺少空格。shell正在查找命令
[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`