0

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

测试.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输出。

4

3 回答 3

3

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

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

如果要检查唯一的参数是否是 --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
    ...

顺便说一句,我不确定您使用该args=($@)行的目的是什么,但是如果您想将参数存储在数组中,正确的方法是args=("$@")——引号阻止它之前进行分词、文件名扩展等将参数放入数组中。

于 2012-09-16T03:08:11.830 回答
1

这应该有效,但仅适用于第一个元素,如果您想要更多,您可能需要执行fororwhile循环来遍历参数。

#!/bin/bash
args=($1)
if [ $args ] && [ $args = "--cron" ]; then
  echo "WORKS!";
    else echo "FAILS"
fi
于 2012-09-16T01:33:55.947 回答
0

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

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

#!/bin/bash
args=($@)
if [ "$*" = "--cron" ]; then 
    echo "WORKS!";
else
    echo "FAILS"
fi
于 2012-09-16T02:04:31.910 回答