Shell脚本变量的使用

4
我来到正题:
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未找到和[6:未找到,因此我认为这是一个非常新手的错误。我觉得逻辑足够严谨,只是我在某个地方犯了一个简单的语法错误,从这两个错误的外观来看,我认为可能是在声明中出了问题。

2个回答

3

由于[实际上是一个命令而不是分隔符,因此在[]之间需要留有空格。

以下是您的脚本以Bash(或ksh)方式重写:

my_var=6
until ((my_var == 0))
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"
        ((my_var--))
    fi
done

然而:
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_VAR--: 需要更多的标记,请详细说明您的解决方案,例如使用(())和[[]]。 - Jewsef
@Jewsef:使用哪个shell,在哪个版本的脚本的哪一行?需要注意的是,我更改了变量名称的大小写,但我不够一致。这可能会导致一些问题。对此我很抱歉-我已经修复了它。在Bash和ksh中,双方括号启用了一些附加功能。使用双圆括号进行数字比较允许您使用==>,例如,而不是丑陋的-eq-gt。它还允许您执行算术操作,如所示的递减((my_var--)) - Dennis Williamson
@Jewsef:我刚刚注意到你的问题中缺少用于关闭 iffi。我将你的脚本复制到我的答案中并忘记修正它(现在已修复)。这可能是你出错的原因。 - Dennis Williamson

0

你的两个错误是由以下原因引起的:

  • until [$MY_VAR = 0]
  • MY_VAR = $(expr $MY_VAR - 1)

[我使用了$()而不是反引号,因为我无法将反引号放入代码部分]

第一个问题是方括号周围缺少空格-两端都是如此。Shell正在查找命令[6(在扩展$MY_VAR之后),而不是[(请查看/usr/bin/ [-实际上它是一个程序)。您还应该使用-eq进行数字比较。= 在这里应该可以正常工作,但前导零可能会破坏字符串比较,而数值比较则可以正常工作:

until [ "$MY_VAR" -eq 0 ]

第二个问题是您在变量赋值中有空格。当您编写MY_VAR = ...时,Shell会寻找命令MY_VAR。请改为以下写法:
MY_VAR=`expr $MY_VAR - 1`

这些答案直接回答了你的问题,但你应该学习Dennis Williamson的答案,以找到更好的方法来做这些事情。


虽然[存在于/usr/bin/[中,但它也是一个shell内置命令,因此具有优先权。要注意不要过度依赖前导零的行为,[ 008 -eq 8 ]可以工作,但[[ 008 -eq 8 ]]会产生“进制值太大”的错误。反引号应该被避免使用,最好使用$() - Dennis Williamson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接