2011-11-17 2 views
1

bash 스크립트에서 옵션을 구문 분석하려고합니다. getopts를 사용하여 선택적 플래그가 입력되었는지 확인할 수 있습니까?bash 스크립트에서 인수/옵션/플래그 구문 분석

FILE1=$1 
FILE2=$2 
outputfile='' 
while getopts "o" OPTION 
do 
    case $OPTION in 
    o) 
     outputfile=$OPTARG 
    ;; 
    esac 
done 
if [ ! $outputfile -eq '' ] 
then 
    cat $FILE1 | paste - | $FILE1 - | tr "\t" "\n" | paste $FILE1 $FILE2 | tr '\t' '\n' > $outputfile 

else 
    cat $FILE1 | paste - | $FILE1 - | tr "\t" "\n" 
    paste $FILE1 $FILE2 | tr '\t' '\n' 
fi 

답변

6

여기에는 여러 가지 문제가 있습니다. 먼저 옵션 (getopts 루프)을 구문 분석 한 다음 인수 목록 (shift $(($OPTIND-1)) 포함)에서 제거해야합니다. 다음은 $ 1 및 $ 2에서 FILE1 및 FILE2를 가져옵니다. 둘째, getopts에게 -o가 인수 (getopts "o:")를 취해야한다고 말할 필요가있다. 셋째, getopts 루프는 잘못된 옵션을 검사해야합니다 (FILE1과 FILE2가 모두 지정되었는지 확인해야합니다). 넷째, $ outputfile이 공백인지 검사 할 때, 그 주위에 큰 따옴표를 넣고 문자열 테스트 (-eq가 숫자 평등을 검사하고, 숫자 이외의 다른 값을 비교할 때 오류가 발생합니다)를 사용합니다. 다섯째, 파일 이름에 재미있는 문자가있는 경우 파일 이름 주위에 큰 따옴표를 두어야합니다. 마지막으로, 실행하려고하는 실제 명령 (붙여 넣기, tr 등)이 이해가되지 않습니다 (그래서 거의 혼자 남겨 두었습니다). 여기에 재 작성 내 샷이야 :

#!/bin/sh 
outputfile='' 
while getopts "o:" OPTION 
do 
    case $OPTION in 
    o) 
     outputfile="$OPTARG" 
    ;; 
    [?]) 
     echo "Usage: $0 [-o outfile] file1 file2" >&2 
     exit 1 
    ;; 
    esac 
done 
shift $(($OPTIND-1)) 

if [ $# -ne 2 ]; then 
    echo "Usage: $0 [-o outfile] file1 file2" >&2 
    exit 1 
fi 
FILE1="$1" 
FILE2="$2" 

if [ -n "$outputfile" ]; then 
    cat "$FILE1" | paste - | "$FILE1" - | tr "\t" "\n" | paste "$FILE1" "$FILE2" | tr '\t' '\n' > "$outputfile" 
else 
    cat "$FILE1" | paste - | "$FILE1" - | tr "\t" "\n" 
    paste "$FILE1" "$FILE2" | tr '\t' '\n' 
fi 
+0

덕분에 나는 아주 배쉬 프로그래밍에 새로운입니다. 이 프로그램을 실행하고 ./test file1 file2라고 말하면 올바른 출력을 출력하지만 먼저 file1을 찾을 수 없다고 말하면서 ./test -o hello file1 file2를 사용하면 file1이 아직 발견되지 않는다고 말합니다. – BillPull

+1

'... | "$ FILE1"- | ...'부분이 $ FILE1을 명령으로 실행하려고하는데,이 명령은 "명령을 찾을 수 없음"오류를 발생시킵니다. 그 부분은 제가 그 부분이별로 의미가 없다고 말한 이유의 일부입니다. –

관련 문제