2017-11-01 11 views
0

플래그가있는 사용자 이름을 가져와야하는 bash 스크립트가 있습니다. 그런 다음 -r 또는 -w를 검색하여 읽기 또는 쓰기가되어야합니다.깃발 만 존재하는지 테스트하기위한 Bash 스크립트

현재 opts를 사용하고 있지만 실제 인수를 -r 및 -w에 전달해야합니다.

플래그에 무엇인가를 넘기지 않고 -r 또는 -w 만 있으면 어떻게 테스트 할 수 있습니까?

#!/bin/bash 
while getopts :u:r:w: opt; do 
    case $opt in 
    u) user="$OPTARG"      ;; 
    r) my_read=1       ;; 
    w) my_write=1       ;; 
    \?) echo "${0##*/}" [ -erw ]; exit 1  ;; 
    esac 
done 

if [[ ${my_write} -eq 1 ]] ; then 
    echo "write" 
fi 

if [[ ${my_read} -eq 1 ]] ; then 
    echo "read" 
fi 
+6

옵션을 사용하지 않으려면 그 뒤에':'sigil을 사용하지 마십시오. 현재 코드는 *'-r'을 명시 적으로 지시하고'-w'는'OPTARG'에 다음 단어를 넣습니다. –

+0

아, 그래, 이제 그게 문제인 것 같아. if 문을 변경하여 플래그가 명령 줄에 입력되었는지 확인하려면 어떻게해야합니까? –

+0

참조. https://stackoverflow.com/a/16496491/297323'-z'는 친구 [ –

답변

2

, 콜론 (:) 앞의 옵션 문자가 필요 나타냅니다 논증. ([email protected]을 최종 경우에 따옴표를 대괄호, 부적절 파이프 점점 피하기 위해 표준 오류 (>&2) 출력을 포함하는 이동의 shift 라인이 있으므로 인수 목록을 추가되었습니다 만든

#!/bin/bash 
while getopts u:rw opt; do 
    case $opt in 
    u) user="$OPTARG"      ;; 
    r) my_read=1       ;; 
    w) my_write=1       ;; 
    \?) echo "${0##*/} [ -erw ]" >&2; exit 1 ;; 
    esac 
done 
shift $((OPTIND-1)) 

if [[ "${my_write}" -eq 1 ]] ; then 
    echo "write" 
fi 

if [[ "${my_read}" -eq 1 ]] ; then 
    echo "read" 
fi 

기타 변경 : 그냥 콜론을 제거 및 $1 등) getopts-parsed 옵션을 제거하고 따옴표를 테스트 주위에 두었습니다. 그렇지 않으면 쉘이 빈 테스트를 통과하는 것에 대해 불평 할 수 있습니다 (-r 또는 -w 중 하나 인 변수가 정의되지 않은 경우 [[ -eq 1]]이 표시됨) 전달되지 않고 유효하지 않은 경우 [[ "" -eq 1 ]]은 단순히 false로 평가됩니다.

1

그냥 매개 변수가없는 옵션으로 그들을 얻을 :

현재 내 스크립트는 다음과 같습니다 코멘트에서 언급 한 바와 같이

while [ -n "$1" ]; do 
case "$1" in 
    -r) echo "read";; 
    -w) echo "write";; 
esac 
shift 
done 
+1

getopts-free 구문 분석에 좀 더 관심이있는 분을 위해 [BashFAQ # 35] (http://mywiki.wooledge.org/BashFAQ/035)가 좋은 참고 자료입니다. –