실행 가능한 bash 파일이 있다고 가정해 보겠습니다 script.sh
.
다음과 같이 사용하고 싶습니다.
./script.sh p1 p2
p1
및 p2
명령의 두 가지 필수 매개변수입니다. 이들 중 하나라도 누락되면 명령이 실패합니다.
그래서 계속 진행하기 전에 확인해야 합니다 script.sh
. 모두 설정되었는지 어떻게 확인할 수 있나요?
고쳐 쓰다:
나는 이것을 시도했습니다 :
# this is a comment line
if [ -n "$1" ] || [ -n "$2" ]; then
then echo 'haha'
fi
하지만 다음을 얻으세요:
./_scp.sh: line 3: syntax error near unexpected token `then'
./_scp.sh: line 3: ` then echo 'haha''
답변1
POSIX 셸에서 두 개의 매개변수가 설정되었는지 확인하려면 다음을 시도해 보세요.
if [ "$#" -lt 2 ]; then
echo >&2 'Need 2 parameter'
exit 1
fi
null이 아닌 두 개의 매개변수를 원하는 경우 -z
대신 를 사용해야 합니다 -n
. -n
길이가 0이 아닌지 테스트하고 -z
길이가 0인지 테스트합니다.
if [ -z "$1" ] || [ -z "$2" ]; then
echo >&2 'Need 2 parameters which are not empty'
exit 1
fi
bash
(and ksh
및 )를 사용하면 zsh
다음을 사용할 수 있습니다.
[ -v var ] && echo var was set
변수가 var
설정되어 있는지 확인하세요.
$ [ -v var ] && echo var was set
$ var=
$ [ -v var ] && echo var was set
var was set
하지만 변수 대신에 이라는 다른 유형의 매개변수라는 $1
점에 유의하세요 .$2
위치 매개변수. [ -v 1 ]
첫 번째 위치 매개변수가 설정되었는지 확인하는 것은 zsh
or 에서는 유효 mksh
하지만 bash
nor 에서는 유효하지 않습니다 ksh93
.
답변2
스크립트가 실패하도록 만들 수 있습니다.
#!/bin/bash
: "${2:?} ${1:?}"
#If either one of the above is unset or null the
#script will have already exited with a meaningful
#diagnstic message written to standard error.
쉘은 오류와 함께 종료되고 자동으로 메시지를 생성합니다. 정확하게 말하면 쉘에 따라 다르지만 일반적으로 다음과 같습니다.
(set --; ${1:?})
sh: 2: 1: parameter not set or null
...어디첫 번째 콜론은 필드를 구분합니다.네 $0
, 다음은 $LINENO
;변수 이름,마침내진단 메시지.과거에도 비슷한 메시지를 본 적이 있을 것입니다.
진단 메시지에 대한 특정 정보를 얻을 수 있습니다.
(set --; ${1:?Hi there!})
sh: 3: 1: Hi there!
또한 이는 인라인 암시적 테스트입니다. 대상 매개변수인 경우예설정되었으며 비어 있지 않음:
(또는 :?
매개변수 확장 구문에서 콜론이 제거된 경우 null일 수도 있음), 정상적으로 확장됩니다.
(set param; echo "${1:?This better not be empty!}")
param
이는 다른 형태의 수정과 동일합니다.매개변수 확장, 위치뿐만 아니라 다른 유형의 매개변수에도 적용될 수 있습니다.
param= bash -c '
printf "Sure hope this works...\n" "${param:?Not a chance!}"
echo ... but what about me\?
' newzero
echo "RETURN: $?"
...내 터미널로 인쇄...
newzero: line 1: param: Not a chance!
RETURN: 127
선택적 진단 메시지는 그 자체로 확장입니다. 확장되는 내용에 관계없이 쉘은 stderr에 기록합니다. --help
스크립트에 옵션 구문 분석을 추가할 때 거의 항상 메시지에 사용합니다. 방금 작은 함수를 만들고 문제가 발생했을 때 예상했던 번호가 매겨진 인수를 전달했습니다.
#script and more script
help(){ eval "\${$param:?\$(cat)}"; } <<HELP
Usage [ and the usual ... ]
HELP
while getopts ....
do case $opt in ($myopts) :;;
(*) param=$OPTIND help;;esac
done