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

Precedence of heredocs and compound commands in bash

我希望我的 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。

这在没有参数时有效,但如果有 个参数则立即退出而不打印任何内容。我认为这是由于运营商的错误优先级。我怎样才能修复这个脚本来做我想做的事?

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

(($#)) || { 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"