我有一个 bash 脚本,case
其中包含一条语句:
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
使用函数来管理代码(而不是变量)并删除重复。