Bash가 오류를 발생시킵니다. 8 행 : $ 1 : 언 바운드 변수


15

getopts를 사용하는 방법을 배우려고 노력하여 구문 분석 된 입력이있는 스크립트를 가질 수 있습니다 (getopts가 더 좋을 수도 있음). 파티션 사용률을 반환하는 간단한 스크립트를 작성하려고합니다. 문제는 내 bash 함수 중 하나가 함수 내 $1에서 변수로 참조하는 것을 좋아하지 않는 것 입니다. 내가 참조하는 이유 $1get_percent함수가 모든 마운트 포인트 대신 표시 할 선택적 인수로 마운트 포인트를 전달할 수 있기 때문 입니다.

스크립트

#!/usr/bin/bash

set -e
set -u
set -o pipefail

get_percent(){
    if [ -n "$1" ] 
    then
        df -h $1 | tail -n +2 | awk '{ print $1,"\t",$5 }'
    else
        df -h | tail -n +2 | awk '{ print $1,"\t",$5 }'
    fi
}

usage(){
    echo "script usage: $(basename $0) [-h] [-p] [-m mount_point]" >&2
}

# If the user doesn't supply any arguments, we run the script as normal
if [ $# -eq 0 ];
then
    get_percent
    exit 0
fi
# ...

출력

$ bash thing.sh
thing.sh: line 8: $1: unbound variable

$ bash -x thing.sh
+ set -e
+ set -u
+ set -o pipefail
+ '[' 0 -eq 0 ']'
+ get_percent
thing.sh: line 8: $1: unbound variable

나는 이것이 관련이 있다고 생각 getopts하지 않습니까? -u를 호출 하기 전에 스크립트가 종료되었습니다 getopts.
ilkkachu

@ikkachu 아니오 그렇지 않은 것 같아요. 그러나 지금 제목을 변경할 수 있는지 잘 모르겠습니다.
Timothy Pulliam

게시물 아래에 질문의 태그 바로 아래에 작은 "수정"텍스트가 있어야합니다.
ilkkachu

답변:


29

set -u설정되지 않은 변수를 참조하면 설명대로 정확하게 중단됩니다. 인수없이 스크립트를 호출하므로 get_percent인수없이 호출되어 $1설정되지 않습니다.

함수를 호출하기 전에이를 확인하거나 기본 확장을 사용하십시오 ( 아직 다른 것으로 설정되지 않은 경우 ${1-default}확장 default).


나는 이것을 의심했지만 그 주위에 방법을 생각할 수 없었다. 기본 확장으로 문제가 해결 된 것 같습니다. 대단히 감사합니다!
Timothy Pulliam

7
특히 [ -n "${1-}" ]매개 변수가 설정되어 있고 비어 있지 않은지 확인하기 위해 빈 기본값으로 사용할 수 있습니다 . 또는 [ "${1+x}" = x ]이 설정되어있는 경우에도 비어있는 경우, 확인합니다.
ilkkachu

사용에도 불구하고 여전히 바운드 변수 오류가 발생합니다if [[ -n ${1-default} ]]
Chaitanya Bapat

@ChaitanyaBapat 대신 대신 unbound variable사용할 때까지 나는 여전히 잘 지내고있었습니다 . 그래서 적어도 나를 위해 no loner는 오류를 일으켰습니다. :--${1:-default}
Adam Badura

6

이 효과입니다 set -u.

$#함수 내부를 점검 하고 $1설정되지 않은 경우 참조를 피할 수 있습니다 .

함께 $#사용하면 매개 변수의 수에 액세스 할 수 있습니다. 글로벌 컨텍스트에서는 스크립트에 대한 매개 변수 수이며 함수에서 함수에 대한 매개 변수 수입니다.

질문의 맥락에서, 그것은

if [ $# -ge 1 ] && [ -n "$1" ]
then
    df -h $1 | tail -n +2 | awk '{ print $1,"\t",$5 }'
else
    df -h | tail -n +2 | awk '{ print $1,"\t",$5 }'
fi

먼저 평가 하고 확인 해야하므로 사용 [ $# -ge 1 ] && [ -n "$1" ]하지 말아야 합니다.[ $# -ge 1 -a -n "$1" ]$1$#


$ # 사용법과 확인 방법에 대해 더 자세히 설명해 주시겠습니까? 감사합니다
Chaitanya Bapat

1
예를 추가했습니다.
RalfFriedl 2014

3

이것이 설정되어 bash있는지 확인 $1하고 바로 사용할 수 있기 때문에 "$@"( $1첫 번째 매개 변수 $@이며 모두입니다. 큰 따옴표로 묶었을 때 값이 없으면 완전히 사라져서 잡히지 않습니다 set -u).

get_percent() {
    df -h "$@" | awk 'NR>1 { printf "%s\t%s\n", $1, $5 }'
}

또한 출력하는 두 값 사이에 {space} {tab} {space}를 얻지 못하고 {tab} 만 얻을 수 있도록 나머지 행을 약간 조정했습니다. 보이지 않는 공백 두 개를 정말로 원한다면를 awk사용하도록 변경하십시오 printf "%s \t %s\n", $1, $5.


나는 이것을 조사해야 할 것이다. 그 변수 유형에 익숙하지 않습니다. 감사합니다
Timothy Pulliam

@TimothyPulliam 나는 $@당신 을 위해 짧은 설명을 추가했습니다
roaima
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.