指定されたパラメーターを使用した構成ファイルの生成

指定されたパラメーターを使用した構成ファイルの生成

- または - (等号なし) を使用して指定できるパラメーターと、 - または - を使用してファイルを出力する機能を含む構成ファイルを作成したいと思います。誰かがこれを行うための一般的なスクリプトを教えてもらえますか?たとえば、MainScriptを実行し、次のようにconfig.cfgでアルファを2に、ベータを3に設定したいとします。

MainScript --alpha 2 --beta 3 --output config.cfg

または

MainScript -a 2 -b 3 -o config.cfg

その後、config.cfgを開くと

alpha = 2
beta = 3

ここで、アルファとベータの名前はランダムに指定されており、より多くのパラメータがあります。これは単なる例です。使用される値は任意の種類の数値であり、検証は不要です。

私はこのスレッドを確認しました(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スクリプトの最後のループはペアでオペランドを繰り返します。最初のオペランドから二重ダッシュを削除し、間に等号の2番目のオペランドを使用して修正値を出力します。最初のオペランドの先頭に二重ダッシュがない場合(例)、-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)

つまり、キーと値がインターリーブされます。 1つのキーの後に値が続き、次に次のペアが続きます。

それからprintf

printf '%s = %s\n'2 つの引数のセット ($1 と $2 と呼ばれる) と出力$1 = $2(後に改行文字が続く) を取ります。 3つ以上のパラメータがある場合は、すべてのパラメータが使用されるまでこの操作を繰り返します。出力はシェルによって次の名前のファイルにリダイレクトされます。$outfile

したがって、この例では、シェルが呼び出す最後の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を呼び出すことは不可能ですが、ユーザーが非常に(非常に、非常に!)長いファイル名を持っていない場合、またはファイル名が多い限り、このエラーが発生する可能性はほとんどありません。オプションであり、この場合、スクリプト呼び出しが最初から成功する可能性はほとんどありません。

関連情報