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
変数の代わりにコードを管理して重複を削除するには、関数を使用してください。