Bash의 스크립트 매개 변수


103

다음과 같이 사용해야하는 셸 스크립트를 만들려고합니다.

ocrscript.sh -from /home/kristoffer/test.png -to /home/kristoffer/test.txt

그러면 스크립트는 이미지 파일을 텍스트 파일로 ocr 변환합니다. 지금까지 내가 생각 해낸 것은 다음과 같습니다.

#!/bin/bash
export HOME=/home/kristoffer
/usr/local/bin/abbyyocr9 -rl Swedish -if ???fromvalue??? -of ???tovalue??? 2>&1

하지만 난 얻을하는 방법을 몰라 -from하고 -to값을. 그것을 수행하는 방법에 대한 아이디어가 있습니까?


답변:


124

당신이 bashscript에 제공 한 인수는 변수에 나타납니다 $1$2$3숫자가 인수를 참조 곳. $0명령 자체입니다.

당신을 제공 할 것이다, 그래서 만약 인수는 공백으로 구분되어 -from-to명령에, 그들은 이것에 대한 너무 너무 이러한 변수에 끝날 것입니다 :

./ocrscript.sh -from /home/kristoffer/test.png -to /home/kristoffer/test.txt

당신은 얻을 것이다:

$0    # ocrscript.sh
$1    # -from
$2    # /home/kristoffer/test.png
$3    # -to
$4    # /home/kristoffer/test.txt

다음 -from과 같이 및를 생략하는 것이 더 쉬울 수 있습니다 -to.

ocrscript.sh /home/kristoffer/test.png /home/kristoffer/test.txt

그러면 다음이 제공됩니다.

$1    # /home/kristoffer/test.png
$2    # /home/kristoffer/test.txt

단점은 올바른 순서로 공급해야한다는 것입니다. 명령 줄에서 명명 된 인수를 쉽게 구문 분석 할 수있는 라이브러리가 있지만 일반적으로 간단한 쉘 스크립트의 경우 문제가 없으면 쉬운 방법을 사용해야합니다.

그런 다음 다음을 수행 할 수 있습니다.

/usr/local/bin/abbyyocr9 -rl Swedish -if "$1" -of "$2" 2>&1

$1및 주위의 큰 따옴표 $2는 항상 필요한 것은 아니지만 큰 따옴표 사이에 넣지 않으면 일부 문자열이 작동하지 않기 때문에 권장됩니다.


69

옵션 이름으로 "from"과 "to"를 사용하는 것에 완전히 집착하지 않은 경우 getopts를 사용하여이를 구현하는 것은 매우 쉽습니다 .

while getopts f:t: opts; do
   case ${opts} in
      f) FROM_VAL=${OPTARG} ;;
      t) TO_VAL=${OPTARG} ;;
   esac
done

getopts 명령 줄 인수를 처리하고 편리하게 구문 분석하는 프로그램입니다.

f:t:값 (콜론으로 표시됨)을 포함하는 2 개의 매개 변수가 필요함을 지정합니다. 이와 같은 것은 플래그로만 해석 될 f:t:v것이라고 말합니다 -v.

opts현재 매개 변수가 저장되는 곳입니다. case이 처리 곳 문이다.

${OPTARG}매개 변수 다음의 값을 포함합니다. ${FROM_VAL}예를 들어 /home/kristoffer/test.png다음과 같이 스크립트를 실행 하면 값을 얻을 수 있습니다.

ocrscript.sh -f /home/kristoffer/test.png -t /home/kristoffer/test.txt

다른 사람들이 제안한 것처럼 bash 스크립트를 처음 작성하는 경우 몇 가지 기본 사항을 실제로 읽어야합니다. 이것은 방법에 대한 간단한 자습서였습니다.getopts 작동 방식 .


1
이것은 읽기 쉬운 해결책 인 것 같습니다. 그러면 두 개의 플래그를 어떻게 지정 하시겠습니까?
Zelphir Kaltstahl

@Zelphir, 플래그 뒤에 ":"를 생략하고 두 개 이상의 플래그를 지정할 수 있습니다. 인스턴스가 들어 f:t:vs있을 것입니다-f some_f -t some_t -v -s
h_s

34

변수 "$1", "$2"등을 사용하여 "$3"인수에 액세스합니다. 이들 모두에 액세스하려면를 사용 "$@"하거나 인수 개수를 가져올 $#수 있습니다 (너무 적거나 너무 많은 인수를 확인하는 데 유용 할 수 있음).


24

내 스크립트가 다양한 시스템, 셸 및 심지어 cygwin 버전간에 완전히 이식 가능한지 확인해야했습니다. 또한 스크립트를 작성해야하는 동료들은 프로그래머이기 때문에 결국 다음을 사용하게되었습니다.

for ((i=1;i<=$#;i++)); 
do

    if [ ${!i} = "-s" ] 
    then ((i++)) 
        var1=${!i};

    elif [ ${!i} = "-log" ];
    then ((i++)) 
        logFile=${!i};  

    elif [ ${!i} = "-x" ];
    then ((i++)) 
        var2=${!i};    

    elif [ ${!i} = "-p" ]; 
    then ((i++)) 
        var3=${!i};

    elif [ ${!i} = "-b" ];
    then ((i++)) 
        var4=${!i};

    elif [ ${!i} = "-l" ];
    then ((i++)) 
        var5=${!i}; 

    elif [ ${!i} = "-a" ];
    then ((i++)) 
        var6=${!i};
    fi

done;

근거 : launcher.sh전체 작업이 서로 거의 독립적 인 여러 단계가 있었기 때문에 스크립트도 포함했습니다 (각 스크립트가 자체적으로 실행될 수 있지만 일반적으로 모두 함께 실행되기 때문에 "준"이라고 말하고 있습니다. ), 그리고 이틀 만에, 프로그래머 인 동료 중 절반 정도가 런처 파일을 사용하거나 "사용법"을 따르거나 그들이 뭔가를 할 때마다 표시되는 도움말을 읽기에는 너무 좋다는 것을 알게되었습니다. 틀렸고 그들은 모든 것을 엉망으로 만들고 잘못된 순서로 인수를 가진 스크립트를 실행하고 스크립트가 제대로 작동하지 않는다고 불평했습니다. 나는 choleric이기 때문에 모든 대본을 점검하여 동료에게 안전한지 확인하기로 결정했습니다. 위의 코드 세그먼트가 첫 번째였습니다.


2
나는 이것을 좋아한다. 내가 마지막에 섹션을 추가 해요`다른 에코 ": {! 내가} 잘못된 인수 $"((I ++)) 파이`
CJBS

6

bash $1에서 스크립트에 전달되는 첫 번째 인수, $2두 번째 등

/usr/local/bin/abbyyocr9 -rl Swedish -if "$1" -of "$2" 2>&1

따라서 다음을 사용할 수 있습니다.

./your_script.sh some_source_file.png destination_file.txt

큰 따옴표에 대한 설명;

세 가지 스크립트를 고려하십시오.

# foo.sh
bash bar.sh $1

# cat foo2.sh
bash bar.sh "$1"

# bar.sh
echo "1-$1" "2-$2"

이제 다음을 호출하십시오.

$ bash foo.sh "a b"
1-a 2-b

$ bash foo2.sh "a b"
1-a b 2-

당신이 호출 할 때 foo.sh "a b"이 호출 후 bar.sh a b(두 개의 인수)와 함께 foo2.sh "a b"이 호출 bar.sh "a b"(1 개 인자). bash에서 매개 변수가 전달되고 확장되는 방법을 항상 염두에두면 많은 두통을 줄일 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.