如何在shell脚本中声明命令行变量?

如何在shell脚本中声明命令行变量?

我想将变量声明为 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 dashbash 的内置help命令还提供了有用的信息getopts- 即help getopts

如果您希望能够使用 GNU 风格的长选项(例如--file, --domain)以及短选项-f-d,您可以使用包getopt中的程序util-linux。请注意,它getopt没有“s”,而内置则带有getopts“s”。

我通常使用 util-linuxgetopt因为我喜欢能够有 --long 选项....但它getopts是标准的,不需要安装任何额外的东西,因为它内置于每个 posix 兼容的 shell 中,并且可以与bash、破折号、ksh 等。

相关内容