如何使用 getopt/getopts
how to use getopt/getopts
所以,我学会了如何在我的 bash 脚本中传递参数。我的下一步是传递带有参数的标志。例如,-id 12345
、-d YES
或 -d NO
、-h localhost
。
所以,我希望像这样执行:
./Build.sh -id 12345 -d YES -h localhost
目前,我是这样做的:
./Build.sh 12345 YES localhost
getopt, getopts 是我追求的吗?如果是这样,你能告诉我如何在我的脚本中使用它吗?
到目前为止我的工作脚本:
if [[ $# != 3 ]]; then
echo "Usage: ./Build.sh <CUSTID> <YES|NO> <HOST>" 2>&1
exit 1
fi
# Checks for YES or NO option for Create.sql script
case in
YES|NO)
filename="Build_.sql"
;;
*)echo "Must enter YES or NO"
exit 1
;;
esac
#!/bin/bash
script="[=10=]"
usage() {
echo "Usage: $script <CUSTID> <YES|NO> <HOST>" 1>&2;
exit 1;
}
while getopts ":i:d:h:" o; do
case "${o}" in
i)
i=${OPTARG}
;;
d)
d=${OPTARG}
if [[ "$d" != YES && "$d" != NO ]]; then
usage
fi
;;
h)
h=${OPTARG}
;;
*)
usage
;;
esac
done
shift $((OPTIND-1))
if [[ -z "$i" || -z "$d" || -z "$h" ]]; then
usage
fi
echo i: $i, d: $d, h: $h, rest: $@
但是,-h
按照约定保留给 "help";您可能希望也可能不想更改它。
如果您使用长选项,即超过 1 个字符的选项,如果您使用getopts
,则必须在其前面加上双破折号。但是,getopt
支持带单破折号的长选项和 -a
。你可以试试getopt -h
看详情,like
-a, --alternative Allow long options starting with single -
此外,getopt
是一个独立程序,而 getopts
是一个 bash 内置命令。我一般用前者。
命令行操作的程序是传统的。他们从程序需要知道的命令行中获取参数。除了参数之外,这些程序通常还采用命令行选项。
复杂的程序可能不仅需要 'Arguments',还需要 'Options'。
例如:程序是否冗长。
ksh MyProgram -v true
或 ksh MyProgram -v false
命令行选项有多种形式。从历史上看,它们前面有一个破折号 - ,并且由一个字母组成。
`-l -a -c`
通常,可以捆绑这些单字符选项:
`-lac`
选项可以有值,值放在选项字符之后(如第一个例子所示或冗长的true或false)
`-s 24` OR `-s24`
由于这些选项非常神秘,因此开发了另一种使用长名称的样式。因此,可以使用更具描述性的 --long
而不是神秘的 -l
。为了区分一束单字符选项和一个长选项,在选项名称之前使用了两个破折号。长选项的早期实现使用加号 +
代替。此外,选项值可以指定为
--size=24
要么
--size 24
+
表单现已过时,强烈反对。
http://perldoc.perl.org/Getopt/Long.html
提供了关于 long getOpts 的非常详细的解释
注意:注意事项。 getopts 非常聪明。用户必须意识到它的陷阱。虽然它的目的是使参数处理更容易,但如果不谨慎使用,它可能容易出错。
所以,我学会了如何在我的 bash 脚本中传递参数。我的下一步是传递带有参数的标志。例如,-id 12345
、-d YES
或 -d NO
、-h localhost
。
所以,我希望像这样执行:
./Build.sh -id 12345 -d YES -h localhost
目前,我是这样做的:
./Build.sh 12345 YES localhost
getopt, getopts 是我追求的吗?如果是这样,你能告诉我如何在我的脚本中使用它吗?
到目前为止我的工作脚本:
if [[ $# != 3 ]]; then
echo "Usage: ./Build.sh <CUSTID> <YES|NO> <HOST>" 2>&1
exit 1
fi
# Checks for YES or NO option for Create.sql script
case in
YES|NO)
filename="Build_.sql"
;;
*)echo "Must enter YES or NO"
exit 1
;;
esac
#!/bin/bash
script="[=10=]"
usage() {
echo "Usage: $script <CUSTID> <YES|NO> <HOST>" 1>&2;
exit 1;
}
while getopts ":i:d:h:" o; do
case "${o}" in
i)
i=${OPTARG}
;;
d)
d=${OPTARG}
if [[ "$d" != YES && "$d" != NO ]]; then
usage
fi
;;
h)
h=${OPTARG}
;;
*)
usage
;;
esac
done
shift $((OPTIND-1))
if [[ -z "$i" || -z "$d" || -z "$h" ]]; then
usage
fi
echo i: $i, d: $d, h: $h, rest: $@
但是,-h
按照约定保留给 "help";您可能希望也可能不想更改它。
如果您使用长选项,即超过 1 个字符的选项,如果您使用getopts
,则必须在其前面加上双破折号。但是,getopt
支持带单破折号的长选项和 -a
。你可以试试getopt -h
看详情,like
-a, --alternative Allow long options starting with single -
此外,getopt
是一个独立程序,而 getopts
是一个 bash 内置命令。我一般用前者。
命令行操作的程序是传统的。他们从程序需要知道的命令行中获取参数。除了参数之外,这些程序通常还采用命令行选项。
复杂的程序可能不仅需要 'Arguments',还需要 'Options'。
例如:程序是否冗长。
ksh MyProgram -v true
或 ksh MyProgram -v false
命令行选项有多种形式。从历史上看,它们前面有一个破折号 - ,并且由一个字母组成。
`-l -a -c`
通常,可以捆绑这些单字符选项:
`-lac`
选项可以有值,值放在选项字符之后(如第一个例子所示或冗长的true或false)
`-s 24` OR `-s24`
由于这些选项非常神秘,因此开发了另一种使用长名称的样式。因此,可以使用更具描述性的 --long
而不是神秘的 -l
。为了区分一束单字符选项和一个长选项,在选项名称之前使用了两个破折号。长选项的早期实现使用加号 +
代替。此外,选项值可以指定为
--size=24
要么
--size 24
+
表单现已过时,强烈反对。
http://perldoc.perl.org/Getopt/Long.html
提供了关于 long getOpts 的非常详细的解释注意:注意事项。 getopts 非常聪明。用户必须意识到它的陷阱。虽然它的目的是使参数处理更容易,但如果不谨慎使用,它可能容易出错。