我想将变量声明为 shell 脚本的命令行参数,就像
./脚本.sh
file=/tmp/domains.txt
domain=abcd.com**
帮助做同样的事情。
答案1
您可以通过指定它们来传递这些变量前命令名称;例如
file=/tmp/domains.txt domain=abcd.com ./script.sh
通过这样做,这些变量会在 shell 脚本运行之前放入环境中,这意味着您可以像任何其他变量一样在 shell 脚本中使用这些变量。
答案2
像这样传递变量是可行的,但需要用户了解脚本的内部结构。如果由于与脚本完全无关的其他原因而在环境中定义了变量(并且用户在运行脚本时忘记在命令行上设置它们),它也可能导致奇怪的、看似难以解释的行为。
更好的方法是使用 shell 的内置选项解析getopts
.例如:
usage() {
# print some help text here, e.g.
echo Usage:
echo " $0 [-f filename] [-d domainname]"
}
# -f and -d are the only valid options and they both
# take strings as arguments.
while getopts f:d: opt; do
case "$opt" in
f) file="$OPTARG" ;;
d) domain="$OPTARG" ;;
*) usage ; exit 1 ;;
esac
done
shift $(expr $OPTIND - 1)
# print help message and exit if either file or domain are
# empty.
[ -z "$file" ] && usage && exit 1
[ -z "$domain" ] && usage && exit 1
有关更多详细信息,请参阅 shell 的手册页(例如man bash
或)。 man dash
bash 的内置help
命令还提供了有用的信息getopts
- 即help getopts
如果您希望能够使用 GNU 风格的长选项(例如--file
, --domain
)以及短选项-f
和-d
,您可以使用包getopt
中的程序util-linux
。请注意,它getopt
没有“s”,而内置则带有getopts
“s”。
我通常使用 util-linuxgetopt
因为我喜欢能够有 --long 选项....但它getopts
是标准的,不需要安装任何额外的东西,因为它内置于每个 posix 兼容的 shell 中,并且可以与bash、破折号、ksh 等。