Bash의 스크립트 매개변수

Bash의 스크립트 매개변수

저는 두 개의 스크립트 매개변수를 가져와 스크립트에서 변수로 사용하는 스크립트를 개발 중입니다. 나는 이것을 작동시킬 수 없으며 내가 뭘 잘못하고 있는지 알 수 없습니다. 문제는 두 번째 매개변수라는 것을 알 수 있습니다. 일부 테스트에서 본 것처럼(이 게시물의 하단에 언급된 대로) 읽혀지지 않습니다.

코드는 다음과 같습니다.

    #!usr/bin/bash


help()
{
   echo ""
    echo "Usage: $0 -p patch_level -e environment"
    echo -e "\t-p Patch level that you are tryin to update the server"
    echo -e "\t-e Environment that the patch need to be run on"
   exit 1 # Exit script after printing help
}


while getopts "p:e" opt
do
   case "${opt}" in
      p ) patch_level="$OPTARG" ;;
      e ) _env="$OPTARG" ;;
      ? ) help ;;    # Print help in case parameter is non-existent

   esac
done


if [ -z "$patch_level" ] || [ -z "$_env" ];    # checking for null parameter
then
   echo "Some or all of the parameters are empty";
   help
else
   echo "$patch_level and $_env"
fi

아래 스크립트를 실행하면 이런 결과가 나옵니다.

> ./restart.sh -p 2021 -e sbx 
>  Some or all of the parameters are empty
> Usage: ./restart.sh -p patch_level -e environment
>         -p Patch level that you are tryin to update the server
>         -e Environment that the patch need to be run on

참고: 저는 이 문서의 세 번째 답변을 기반으로 코드를 모델링했습니다.

명령줄 매개변수를 쉘 스크립트에 전달하는 방법은 무엇입니까?

문제는 두 번째 변수(-e)에 있다는 것을 알았습니다. 왜냐하면 마지막 if 문을 "or"에서 "and"로 변경하면 스크립트가 실행되지만 두 번째 변수에 대해서는 아무 것도 인쇄하지 않기 때문입니다.

그게 내가 말하고 싶은 거야

if [ -z "$patch_level" ] && [ -z "$_env" ];

출력은 다음과 같습니다

./restart.sh -p 2021 -e sbx
  2021 and
 This server will be patched to 2021

그게 중요하다면 나는 우분투에 있습니다.

답변1

$_env매개변수를 에 전달한 방식으로 인해 설정되지 않았습니다 getopts.

옵션에 인수가 필요함을 e알리려면 옵션 뒤에 콜론을 추가해야 합니다 .getopts

while getopts "p:e:" op
                  ^
              mandatory here

확인하다:

help getopts | less

관련 정보