考虑到:
#!/bin/sh
while getopts ":h" o; do
case "$o" in
h )
"Usage:
sh $(basename "$0") -h Displays help message
sh $(basename "$0") arg Outputs ...
where:
-h help option
arg argument."
exit 0
;;
\? )
echo "Invalid option -$OPTARG" 1>&2
exit 1
;;
: )
echo "Invalid option -$OPTARG requires argument" 1>&2
exit 1
;;
esac
done
这个调用返回not found
为什么?
$ sh getopts.sh -h
getopts.sh: 12: getopts.sh: Usage:
sh getopts.sh -h Displays help message
sh getopts.sh arg Outputs ...
where:
-h help option
arg argument.: not found
还行吧:
$ sh getopts.sh arg
对于这个,我期待“无效选项”:
$ sh getopts.sh
还行吧:
$ sh getopts.sh -s x
Invalid option -s
答案1
您似乎错过了打印消息,而是将整个字符串作为要运行的命令传递。echo
在字符串前添加一个
case "$o" in
h )
echo "Usage:
sh $(basename "$0") -h Displays help message
sh $(basename "$0") arg Outputs ...
where:
-h help option
arg argument."
exit 0
;;
但通常更喜欢添加定界符的方式来打印多行字符串:
show_help() {
cat <<'EOF'
Usage:
sh $(basename "$0") -h Displays help message
sh $(basename "$0") arg Outputs ...
where:
-h help option
arg argument.
EOF
}
并将该函数show_help
用于-h
标志。
同样对于空参数标志,第一个调用getopts()
退出循环,因此循环内不能有句柄。在调用之前对空参数进行一般检查getopts()
if [ "$#" -eq 0 ]; then
printf 'no argument flags provided\n' >&2
exit 1
fi
根据您之前对参数 flag 的定义:h
,表明-h
不接受任何参数。该子句仅在您定义为采用参数:)
时适用,即定义为 时。只有这样,您才能在不传递参数的情况下运行它,下面的代码才会被执行。将整个脚本放在一起-h
:h:
:)
#!/usr/bin/env bash
if [ "$#" -eq 0 ]; then
printf 'no argument flags provided\n' >&2
exit 1
fi
show_help() {
cat <<'EOF'
Usage:
sh $(basename "$0") -h Displays help message
sh $(basename "$0") arg Outputs ...
where:
-h help option
arg argument.
EOF
}
while getopts ":h:" opt; do
case "$opt" in
h )
show_help
exit 1
;;
\? )
echo "Invalid option -$OPTARG" 1>&2
exit 1
;;
: )
echo "Invalid option -$OPTARG requires argument" 1>&2
exit 1
;;
esac
done
现在运行它
$ bash script.sh
no argument flags provided
$ bash script.sh -h
Invalid option -h requires argument
$ bash script.sh -s
Invalid option -s