지정된 매개변수를 사용하여 구성 파일 생성

지정된 매개변수를 사용하여 구성 파일 생성

- 또는 -(등호 없이)를 사용하여 지정할 수 있는 매개변수와 - 또는 -를 사용하여 파일을 출력하는 기능이 포함된 구성 파일을 만들고 싶습니다. 누군가 이 작업을 수행하기 위한 일반 스크립트를 알려줄 수 있습니까? 예를 들어, 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스크립트 끝의 루프는 쌍으로 피연산자를 반복합니다. 첫 번째 피연산자에서 이중 대시를 제거하고 사이에 등호가 있는 두 번째 피연산자를 사용하여 수정된 값을 출력합니다. 첫 번째 피연산자의 시작 부분에 이중 대시가 없는 경우(예: -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(뒤에 개행 문자가 옴)을 취합니다. 세 개 이상의 매개변수가 있는 경우 모든 매개변수가 사용될 때까지 이 작업을 반복합니다. 출력은 셸에 의해 다음 이름의 파일로 리디렉션됩니다.$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를 호출하는 것이 불가능할 수 있지만 사용자가 매우 (매우, 매우!) 긴 파일 이름을 가지고 있지 않거나 파일 이름이 많지 않은 한 이 오류가 발생할 가능성은 거의 없습니다. 옵션이며, 이 경우 스크립트 호출이 처음부터 성공할 가능성은 거의 없습니다.

관련 정보