我想创建一个配置文件,其中包含可以使用 - 或 -- (不带等号)指定的参数,以及使用 - 或 -- 输出文件的能力。有人可以向我指出一个通用脚本来执行此操作吗?举例来说,我想运行 MainScript 并在 config.cfg 中将 alpha 设置为 2,将 beta 设置为 3,方法是:
MainScript --alpha 2 --beta 3 --output config.cfg
或者
MainScript -a 2 -b 3 -o config.cfg
那么如果我打开 config.cfg 它就会
alpha = 2
beta = 3
这里的 Alpha 和 beta 是任意命名的,还会有更多参数,这些只是示例。使用的值可以是任何类型的数字,无需验证。
我已经检查过这个线程(https://stackoverflow.com/questions/192249/how-do-i-parse-command-line-arguments-in-bash),但似乎无法使任何工作发挥作用,我也没有使用 Bash 的第 4 版。谢谢!
答案1
#!/bin/sh
outfile=/dev/stdout
while getopts 'o:' opt; do
case $opt in
o) outfile=$OPTARG ;;
*) echo 'Error in command line parsing' >&2
exit 1
esac
done
shift "$(( OPTIND - 1 ))"
while [ "$#" -gt 0 ]; do
printf '%s = %s\n' "${1#--}" "$2"
shift 2
done >$outfile
该脚本将采用一个-o
选项,将输出文件设置为给定的选项参数。如果-o
不使用,输出将转到标准输出。
脚本命令行的非选项位必须在 后给出--
。双破折号是一种标准方式,表示实用程序没有更多选项,并且其余操作数不应作为命令行选项进行处理。我们在这里使用这个事实,这样getopts
就不会被命令行末尾出现的类似选项的字符串所混淆(这些是不是该脚本的选项)。
while
脚本末尾的循环将成对迭代操作数。它将从第一个操作数中去掉双破折号,并与第二个操作数一起输出修改后的值,中间有等号。如果第一个操作数开头没有双破折号(如-alpha
),则该值保持不变。输出被重定向到给定的输出文件名。
运行示例:
$ ./script.sh -o out -- --alpha 2 --beta 4 --abba "Dancing Queen" --xxx --yyy
$ cat out
alpha = 2
beta = 4
abba = Dancing Queen
xxx = --yyy
没有命令行解析的较短变体:
#!/bin/sh
while [ "$#" -gt 0 ]; do
printf '%s = %s\n' "${1#--}" "$2"
shift 2
done
这将与命令行上的重定向一起使用,将结果写入文件:
./script.sh --alpha 2 --beta 4 --abba "Dancing Queen" --xxx --yyy >outfile
答案2
尝试将此脚本作为基础,根据您自己的参数扩展/修改它:
#!/bin/bash
config=()
outfile=default-outfile.cfg
while [[ $# -gt 0 ]]
do
case "$1" in
-a|--alpha)
config+=(alpha "$2")
shift 2
;;
-b|--beta)
config+=(beta "$2")
shift 2
;;
-o)
outfile="$2"
shift 2
;;
*)
echo >&2 "Error parsing arguments: unknown option $1"
exit 1
esac
done
printf '%s = %s\n' "${config[@]}" > "$outfile"
循环while
遍历所有命令行参数,并从中创建一个数组,例如
config=(alpha 2 beta 3)
即键和值是交错的 - 一个键后面跟着一个值,然后是下一对。
然后通过调用将它们打印到配置文件中就很简单了printf
。
printf '%s = %s\n'
使用一组两个参数(我们称它们为 $1 和 $2)和输出$1 = $2
(后跟换行符)。如果存在两个以上的参数,它将循环执行此操作,直到消耗完所有参数。它的输出被 shell 重定向到名为的文件中$outfile
因此,本示例中由 shell 调用的最终 printf 命令是
printf '%s = %s\n' "alpha" "2" "beta" "3"
并产生输出
alpha = 2
beta = 3
更多示例:
$ ./script.sh --alpha 2 -b 5
$ cat default-outfile.cfg
alpha = 2
beta = 5
$ ./script.sh --alpha omega --yankee doodledandy
Error parsing arguments: unknown option --yankee
$ cat default-outfile.cfg
alpha = 2
beta = 5
$ # (unchanged, as there was an error)
$ ./script.sh -a omega -o otherfile.cfg
$ cat otherfile.cfg
alpha = omega
$
请注意,由于特定于平台的限制,可能无法使用许多参数调用 printf,但是除非您的用户使用非常(非常非常!)长的文件名或许多文件名,否则您不太可能遇到这种错误。选项,并且在这种情况下,对脚本的调用一开始就不太可能成功。