如何从 getopts 中获取 2 个参数
How to take 2 argument from getopts
我正在创建一个 bash 脚本,该脚本将来自命令行的用户的两个参数。但我不确定我如何从用户那里获取 2 个参数,如果不传递,这两个参数都是必需的,将显示错误和脚本中的 return。下面是我用来从用户那里获取参数的代码,但目前我的 getopts 只接受一个参数。
optspec="h-:"
while getopts "$optspec" optchar; do
case "${optchar}" in
-)
case "$OPTARG" in
file)
display_usage ;;
file=*)
INPUTFILE=${OPTARG#*=};;
esac;;
h|*) display_usage;;
esac
done
我如何添加一个选项以从命令行获取更多参数。喜欢下面
script.sh --file="abc" --date="dd/mm/yyyy"
getopts
不支持长参数。它只支持单字母参数。
您可以使用 getopt
。它不像 getopts
那样广泛可用,后者来自 posix,随处可用。 getopt
肯定会在任何 linux 上可用,而不仅仅是。在 linux 上,它是 linux-utils
的一部分,一组最基本的实用程序,如 mount
或 swapon
。
典型的 getopt
用法如下:
if ! args=$(getopt -n "your_script_name" -oh -l file:,date: -- "$@"); then
echo "Error parsing arguments" >&2
exit 1
fi
# getopt parses `"$@"` arguments and generates a nice looking string
# getopt .... -- arg1 --file=file arg2 --date=date arg3
# would output:
# --file file --date date -- arg1 arg2 arg3
# the idea is to re-read bash arguments using `eval set`
eval set -- "$args"
while (($#)); do
case "" in
-h) echo "help"; exit; ;;
--file) file=""; shift; ;;
--date) date=""; shift; ;;
--) shift; break; ;;
*) echo "Internal error - programmer made an error with this while or case" >&2; exit 1; ;;
esac
shift
done
echo file="$file" date="$date"
echo Rest of arguments: "$@"
我正在创建一个 bash 脚本,该脚本将来自命令行的用户的两个参数。但我不确定我如何从用户那里获取 2 个参数,如果不传递,这两个参数都是必需的,将显示错误和脚本中的 return。下面是我用来从用户那里获取参数的代码,但目前我的 getopts 只接受一个参数。
optspec="h-:"
while getopts "$optspec" optchar; do
case "${optchar}" in
-)
case "$OPTARG" in
file)
display_usage ;;
file=*)
INPUTFILE=${OPTARG#*=};;
esac;;
h|*) display_usage;;
esac
done
我如何添加一个选项以从命令行获取更多参数。喜欢下面
script.sh --file="abc" --date="dd/mm/yyyy"
getopts
不支持长参数。它只支持单字母参数。
您可以使用 getopt
。它不像 getopts
那样广泛可用,后者来自 posix,随处可用。 getopt
肯定会在任何 linux 上可用,而不仅仅是。在 linux 上,它是 linux-utils
的一部分,一组最基本的实用程序,如 mount
或 swapon
。
典型的 getopt
用法如下:
if ! args=$(getopt -n "your_script_name" -oh -l file:,date: -- "$@"); then
echo "Error parsing arguments" >&2
exit 1
fi
# getopt parses `"$@"` arguments and generates a nice looking string
# getopt .... -- arg1 --file=file arg2 --date=date arg3
# would output:
# --file file --date date -- arg1 arg2 arg3
# the idea is to re-read bash arguments using `eval set`
eval set -- "$args"
while (($#)); do
case "" in
-h) echo "help"; exit; ;;
--file) file=""; shift; ;;
--date) date=""; shift; ;;
--) shift; break; ;;
*) echo "Internal error - programmer made an error with this while or case" >&2; exit 1; ;;
esac
shift
done
echo file="$file" date="$date"
echo Rest of arguments: "$@"