- 또는 -(등호 없이)를 사용하여 지정할 수 있는 매개변수와 - 또는 -를 사용하여 파일을 출력하는 기능이 포함된 구성 파일을 만들고 싶습니다. 누군가 이 작업을 수행하기 위한 일반 스크립트를 알려줄 수 있습니까? 예를 들어, 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를 호출하는 것이 불가능할 수 있지만 사용자가 매우 (매우, 매우!) 긴 파일 이름을 가지고 있지 않거나 파일 이름이 많지 않은 한 이 오류가 발생할 가능성은 거의 없습니다. 옵션이며, 이 경우 스크립트 호출이 처음부터 성공할 가능성은 거의 없습니다.