Bash ARGS帮助 - 获得随机错误

时间:2012-09-16 01:25:27

标签: linux bash args

如果设置某个变量,尝试设置规则,有人可以识别我在这里丢失的wtf吗?

test.sh:

#!/bin/bash
args=($@)
if [ "$@" = "--cron" ]; then 
 echo "WORKS!";
    else echo "FAILS"
fi

./test.sh的输出:

./test.sh: line 3: [: =: unary operator expected
FAILS

但是,当我运行./test.sh --cron时,它会起作用,并输出WORKS

3 个答案:

答案 0 :(得分:3)

执行此操作的正确方法会有所不同,具体取决于您要执行的操作。如果要检查第一个参数是否为--cron,请使用:

if [ "$1" = "--cron" ]; then

如果要检查 only 参数是否为--cron,请使用:

if [ "$*" = "--cron" ]; then

(请注意,这是极少数情况下"$*"是正确做事的方法之一 - 它扩展到由空格分隔的所有参数,但作为单个单词用于解析目的。)

如果你想检查任何参数是否是--cron,请使用:

cronopt=false
for argument; do
    if [ "$argument" = "--cron" ]; then
        cronopt=true
        break    # note: if you are scanning the arguments for other things too, remove this
    fi
done
if $cronopt; then
    ...

BTW,我不确定你使用args=($@)行的是什么,但是如果你想将参数存储在一个数组中,正确的方法就是args=("$@") - 在将args放入数组之前,引号不会进行单词拆分,文件名扩展等。

答案 1 :(得分:1)

这应该可行,但只有第一个元素,你想要更多,你可能需要做forwhile循环来迭代参数。

#!/bin/bash
args=($1)
if [ $args ] && [ $args = "--cron" ]; then
  echo "WORKS!";
    else echo "FAILS"
fi

答案 2 :(得分:0)

在这种情况下,我认为"$@"引用得太好了。

尝试与"$1"进行比较,或使用:

#!/bin/bash
args=($@)
if [ "$*" = "--cron" ]; then 
    echo "WORKS!";
else
    echo "FAILS"
fi