BASH:如果传递第一个参数后没有参数,如何传递默认参数

BASH:如果传递第一个参数后没有参数,如何传递默认参数

我有一个 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,但前提是用户除了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

使用函数来管理代码(而不是变量)并删除重复。

相关内容