매개변수가 선언되었는지 테스트하는 올바른 방법입니까?

매개변수가 선언되었는지 테스트하는 올바른 방법입니까?

이것은 예이다https://unix.stackexchange.com/a/56846/674

어떤 유형의 변수가 선언되었는지 테스트하는 또 다른 bash 관련 방법은 해당 변수가 다음에 나열되어 있는지 확인하는 것입니다 ${!PREFIX*}.

case " ${!foobar*} " in
  *" foobar "*) echo "foobar is declared";;
  *) echo "foobar is not declared";;
esac
  1. 내 말이 맞다면 매개변수를 선언 취소하기 위해 unset내장 기능을 사용합니다. 이 unset사건은 인용문에서 말하는 것과 같습니다.

    $ unset foobar
    $ case " ${!foobar*} " in
    >   *" foobar "*) echo "foobar is declared";;
    >   *) echo "foobar is not declared";;
    > esac
    foobar is not declared
    

    그러나 declare사례 d는 다음을 수행하지 않습니다.

    $ unset foobar
    $ declare foobar
    $ case " ${!foobar*} " in
    >   *" foobar "*) echo "foobar is declared";;
    >   *) echo "foobar is not declared";;
    > esac
    foobar is not declared
    

    매개변수가 선언되었는지 테스트하는 올바른 방법입니까?

  2. 그리고 " ${!foobar*} "매개변수 확장 전후에 공백이 있는 이유는 무엇입니까? 배열이나 사전인 경우 와 변수이지만 배열이나 사전이 아닌 경우에도 foobar작동합니까 ?

답변1

  1. 변수를 값(null일 수 있음)으로 선언해야 하는 것 같습니다.

    unset foobar; declare foobar=
    

    Case 문은 "foobar 선언됨"을 생성합니다.

  2. *" foobar "*특정 변수 이름을 감지할 수 있도록 따옴표와 공백을 사용합니다.목록반환된 변수 이름 수 ${!foobar*}:

    $ unset foobar; foobarbaz=1; foobarquz=2
    $ echo " ${!foobar*} "
     foobarbaz foobarquz 
    

    Case 문은 "foobar가 선언되지 않았습니다"를 생성합니다.

관련 정보