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