Bash 스크립트: 잘못된 매개변수 값이 설정되었습니다.

Bash 스크립트: 잘못된 매개변수 값이 설정되었습니다.

질문

몇 가지 다른(선택적) 명령줄 인수를 허용하는 스크립트가 있습니다. 특정 매개변수의 경우 값이 "적게" 발생하지만 그 이유는 알 수 없습니다.

배쉬 코드

while getopts ":d:f:p:e:" o; do
  case "${o}" in
        d)
            SDOMAIN=${OPTARG}
            ;;
        f)
            FROM=${OPTARG}
            ;;
        p)
            PAGER=${OPTARG}
            ;; 
        e)
            DESTEXT=${OPTARG}
            ;;                       
        *)
            show_usage
            ;;          
    esac
done

source "./utils.sh"
test #test includes

echo "$SDOMAIN is the sdomain"
echo "$FROM is the from"
echo "$PAGER is the pager"
echo "$DESTEXT is the extension"

exit

산출

스크립트를 실행하면 다음과 같이 표시됩니다.

lab-1:/tmp/jj# bash mssp.sh -d testdomain.net         
Utils include worked!                                       
testdomain.net is the sdomain                                               
 is the from                                                                    
less is the pager                                                               
 is the extension                                 

왜 호출기에서 "더 적은" 값이 나오는지 이해가 되지 않습니다. 빈 문자열이 나타날 것으로 예상됩니다. 내 실수를 보면 알려주세요. 나는 이것을 너무 오랫동안 지켜보고 있었다.

답변1

스크립트는 PAGER를 설정하지 않지만 현재 환경에서 변수를 내보낼 수 있습니다 declare -p PAGER.

스크립트에서 다른 변수 이름을 사용하는 것이 좋습니다. 이것이 일반적으로 자신의 변수에 대문자 변수를 사용하지 않는 것이 권장되는 이유입니다.

답변2

PAGER일반적으로 사용되는 환경 변수(예 EDITOR: )입니다. 매뉴얼 페이지에 언급된 몇 가지 예는 다음과 같습니다.

남성(우선순위임에도 불구하고 MANPAGER):

-P pager, --pager=pager
사용할 출력 호출기를 지정합니다. 기본적으로 이 옵션을 man사용하면 환경 변수가 재정의되고, 결과적으로 환경 변수가 재정의됩니다.pager$MANPAGER$PAGER

자식:

-p, --paginate
표준 출력이 터미널인 경우 모든 출력을 터미널로 파이프합니다 less(또는 설정된 경우). 이는 구성 옵션을 재정의합니다(아래 "구성 메커니즘" 섹션 참조).$PAGERpager.<cmd>

스크립트가 출력을 파이프하려는 프로그램의 이름을 보유하는 것 이외의 다른 의미로 변수를 사용하는 경우 명확성을 위해 다른 이름을 사용하는 것이 좋습니다. 그럼에도 불구하고 주변 환경이 들어올 수 있다는 점을 기억하세요.어느변수이므로 변수가 비어 있는지 확인하려면 명시적으로 빈 문자열을 할당해야 합니다. 또는 unset설정을 해제하려는 경우.

이것은 당신이 내려야 할 결정이지만. 일부 사용자는 환경을 통해 구성 항목을 전달할 수 있는 가능성을 높이 평가할 수 있습니다.

관련 정보