BASH: 첫 번째 매개변수 이후에 매개변수가 전달되지 않는 경우 기본 매개변수를 전달하는 방법

BASH: 첫 번째 매개변수 이후에 매개변수가 전달되지 않는 경우 기본 매개변수를 전달하는 방법

case다음 명령문이 포함된 bash 스크립트가 있습니다 .

case "$1" in 
    bash)
        docker exec -it $(docker-compose ps -q web) /bin/bash
        ;;
    shell)
        docker exec -it $(docker-compose ps -q web) python manage.py shell
        ;;
    test)
        docker exec -it $(docker-compose ps -q web) python manage.py test "${@:2}"
        ;;
esac

test명령 에서 기본 매개변수를 전달하고 싶지만 apps사용자가 testbash 스크립트를 제외한 어떤 매개변수도 전달하지 않는 경우에만 가능합니다.

따라서 사용자가 다음과 같이 스크립트를 실행하면:

./do test

명령을 실행해야합니다

docker exec -it $(docker-compose ps -q web) python manage.py test apps

그러나 다음과 같이 스크립트를 실행하는 경우:

./do test billing accounts

명령을 실행해야합니다

docker exec -it $(docker-compose ps -q web) python manage.py test billing accounts

매개변수가 존재하는지 테스트하는 방법뒤쪽에첫 번째 주장?

답변1

bash 변수 대체를 사용해 보았습니다.

   test)
        shift
        docker exec -it $(docker-compose ps -q web) python manage.py test "${@-apps}"
        ;;

$*대신 다른 방법을 확인하는 것이 좋습니다 $1.

case $* in 
    bash)
         ...
    test)
         docker exec -it $(docker-compose ps -q web) python manage.py test apps
         ;;
    test\ *)
         docker exec -it $(docker-compose ps -q web) python manage.py test "${@:2}"
         ;;

답변2

case $1:$# in
(test:1)
    docker $(this is bad) python test apps;;
(test:$#)
    docker $(still bad) python "$@";;
(bash:$#)
    docker ...
esac

답변3

이런 식으로 하면 정말 좋을 것 같아요

if [ -z "$2" ]
  then
    echo "No argument supplied"
fi

답변4

인수에 공백이나 개행 문자가 없는 경우.
매개변수를 문자열로 변환 "$*"하고 사용합니다.

f(){ docker exec -it $(docker-compose ps -q web) "$@"; }

case "$*" in
    bash)       f /bin/bash                    ;;
    shell)      f python manage.py shell       ;;
    test)       f python manage.py test apps   ;;
    test\ ?*)   f python manage.py "$@"        ;;
esac

변수 대신 코드를 관리하고 중복을 제거하려면 함수를 사용하세요.

관련 정보