使用指定参数创建配置文件

使用指定参数创建配置文件

我想创建一个配置文件,其中包含可以使用 - 或 -- (不带等号)指定的参数,以及使用 - 或 -- 输出文件的能力。有人可以向我指出一个通用脚本来执行此操作吗?举例来说,我想运行 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,但是除非您的用户使用非常(非常非常!)长的文件名或许多文件名,否则您不太可能遇到这种错误。选项,并且在这种情况下,对脚本的调用一开始就不太可能成功。

相关内容