bash中heredocs和复合命令的优先级

时间:2015-03-11 23:41:55

标签: bash operator-precedence heredoc

我希望我的shell脚本打印出一个简单的用法指令,然后在没有参数的情况下调用它时退出。这就是我的尝试:

#!/bin/bash
(($#)) || cat <<EOF && exit

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Usage: Donec a diam lectus.

EOF

echo "You have provided at least one argument"

(特殊的bash变量$#包含参数的数量,并且用双括号将其括起来使得在没有参数时将其计算为false。

这在没有参数的情况下有效,但如果参数,则立即退出而不打印任何内容。我认为这是由于运营商的错误优先权。如何修复此脚本以执行我想要的操作?

1 个答案:

答案 0 :(得分:3)

使用花括号对命令进行分组:

(($#)) || { cat <<EOF && exit
Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Usage: Donec a diam lectus.

EOF
}
echo "You have provided at least one argument"

或者您可以放弃紧凑格式,并使用if

if [[ $# == 0 ]]
then cat <<EOF && exit
Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Usage: Donec a diam lectus.

EOF
fi

echo "You have provided at least one argument"