所以,我已经学会了如何在我的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 $2 in
YES|NO)
filename="Build_$2.sql"
;;
*)echo "Must enter YES or NO"
exit 1
;;
esac
答案 0 :(得分:3)
#!/bin/bash
script="$0"
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
按惯例保留用于“帮助”;你可能希望也可能不希望改变它。
答案 1 :(得分:0)
如果使用长选项,即超过1个字符的选项,如果使用getopts
,则必须在其前加上双击。但是,getopt
支持使用-a
的单个短划线的长选项。您可以尝试getopt -h
查看详细信息,例如
-a, --alternative Allow long options starting with single -
此外,getopt
是一个独立程序,而getopts
是一个bash内置命令。我通常使用前者。
答案 2 :(得分:0)
命令行操作程序是传统的。他们从程序需要知道的命令行中获取参数。除了参数之外,这些程序通常也会使用命令行选项。
复杂的程序可能不仅需要“参数”,还需要“选项”。
例如:程序是否详细。
ksh MyProgram -v true
或ksh MyProgram -v false
命令行选项有多种形式。从历史上看,它们前面有一个短划线 - 并且由一个字母组成。
`-l -a -c`
通常,这些单字符选项可以捆绑在一起:
`-lac`
选项可以有值,值放在选项字符后面(如第一个例子中所示,或者是详细的true或false)
`-s 24` OR `-s24`
由于这些选项非常神秘,所以开发了另一种使用长名称的风格。因此,可以使用更具描述性的-l
而不是隐秘的--long
。为了区分一组单字符选项和一个长字符选项,在选项名称之前使用两个破折号。早期的长期选项实现使用加号+
代替。此外,可以指定选项值,如
--size=24
要么
--size 24
+
表单现在已过时且强烈弃用。
有关长getOpts的详细说明,请访问http://perldoc.perl.org/Getopt/Long.html
注意:请注意。 getopts非常聪明。用户必须意识到它的缺陷。虽然它的目的是使参数处理更容易,但如果不小心使用它可能容易出错。