web-dev-qa-db-ja.com

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のデフォルト引数を渡したいのですが、ユーザーが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

引数の存在をテストするにはどうすればよいですか最初の引数?

6
synic

私はbash変数置換を使用しようとします:

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

もう1つの方法は、$*ではなく$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}"
         ;;
8
Costas

このようなものはうまくいくでしょう

if [ -z "$2" ]
  then
    echo "No argument supplied"
fi
case $1:$# in
(test:1)
    docker $(this is bad) python test apps;;
(test:$#)
    docker $(still bad) python "$@";;
(bash:$#)
    docker ...
esac
2
mikeserv

set ...を使用して、必要に応じて引数をリセットできます

case "$1" in 
    #...
    test)
        [ $# -lt 2 ] && set test apps
        docker exec -it $(docker-compose ps -q web) python manage.py $@
        ;;
esac
2
technosaurus

引数にスペースや改行がない場合。
引数を文字列に変換します:"$*"、それを使用します:

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

関数を使用してコード(変数ではない)を管理し、繰り返しを削除する。

1
user79743