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

変数の代わりにコードを管理して重複を削除するには、関数を使用してください。

関連情報