이 두 매개변수가 bash에 설정되어 있는지 확인하는 방법은 무엇입니까? [폐쇄]

이 두 매개변수가 bash에 설정되어 있는지 확인하는 방법은 무엇입니까? [폐쇄]

실행 가능한 bash 파일이 있다고 가정해 보겠습니다 script.sh.

다음과 같이 사용하고 싶습니다.

./script.sh p1 p2

p1p2명령의 두 가지 필수 매개변수입니다. 이들 중 하나라도 누락되면 명령이 실패합니다.

그래서 계속 진행하기 전에 확인해야 합니다 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 ]첫 번째 위치 매개변수가 설정되었는지 확인하는 것은 zshor 에서는 유효 mksh하지만 bashnor 에서는 유효하지 않습니다 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

관련 정보