直 bash 空参数无法识别

Straight bash empty parameter not recognized

美好的一天!

出于学习目的,我正在开发一个 Django 项目。现在我有一些 bash 脚本(正常工作)来迁移我的 Django 数据库并创建一个具有 onetoone 配置文件的超级用户。

现在我想更新我的 bash 脚本,以便它识别一些参数。例如,在成功迁移数据库后自动 运行 模型迁移 (makemigrations) 或 运行 服务器。

所以我想告诉 bash 在迁移之前进行迁移,并在完成后 运行 服务器(没有值的键)。

(venv)edwin@edwin:/project/installs/$ source install_database.sh -m -r

现在,我是 Linux 的新手,也是 Straight Bash Space Separated bash 脚本的新手。我读过在这种情况下使用 getopt[s] 没有用,因为它不能处理空参数字符串。

所以我尝试创建直线 Bash Space 分隔如下:

#!/usr/bin/env bash

while [[ %# > 1 ]]
do
    key=

    case $key in
        -m|--makemigrations)
        MAKEMIGRATIONS=true
        shift
        ;;
        -r|--runserver)
        RUNSERVER=true
        shift
        ;;
        *)
        echo "invalid argument"
        ;;
    esac
shift
done

echo "${RUNSERVER}"
echo "${MAKEMIGRATIONS}"

无论我尝试发起什么

(venv)edwin@edwin:/project/installs/$ source install_database.sh -m -r
(venv)edwin@edwin:/project/installs/$ source install_database.sh -m "test" -r "test"
(venv)edwin@edwin:/project/installs/$ source install_database.sh -m test -r test

我不断得到结果

false
false

可能是初学者的错误,但我似乎无法弄清楚... 你能给我解释一下我做错了什么,并引导我朝着正确的方向解决问题吗?

提前致谢!

三个错误:

1) %# 应该是 $#

2) 在接受密钥的情况下,您有两条 shift 指令(一条在 case 内,一条在 while 循环末尾)。只需删除 case 内的 shift 并保留循环末尾的 shift 即可(记住,即使无法识别键,您也想换档)。

3) $# 给出了不包括程序名的参数个数,所以 while 循环条件应该是 while [[ $# > 0 ]]