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