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
사용자가 test
bash 스크립트를 제외한 어떤 매개변수도 전달하지 않는 경우에만 가능합니다.
따라서 사용자가 다음과 같이 스크립트를 실행하면:
./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
변수 대신 코드를 관리하고 중복을 제거하려면 함수를 사용하세요.