【问题标题】:Straight bash empty parameter not recognized直接 bash 空参数无法识别
【发布时间】:2016-03-04 00:55:18
【问题描述】:

美好的一天!

出于学习目的,我正在开发一个 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] 没有用,因为它不能处理空参数字符串。

所以我尝试创建像这样分隔的 Straight Bash Space:

#!/usr/bin/env bash

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

    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

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

提前致谢!

【问题讨论】:

  • 脚本中没有提到“False”。它从何而来?另外,%# 是什么?
  • 我一直在网上搜索以了解如何让 bash 接受参数。这导致我 http://stackoverflow.com/questions/192249/how-do-i-parse-command-line-arguments-in-bash/14203146#14203146 我不确定它是如何得到错误的,但是我想它可能会在空或未设置的变量上返回 false?关于 %#,我认为这是计算参数数量的某种形式。根据您的反应,这可能是一个错误的假设(注意:False = false(小写,我的错))

标签: linux bash command-line-arguments


【解决方案1】:

三个错误:

1) %# 应该是 $#

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

3) $# 为您提供不包括程序名称的参数数量,因此 while 循环条件应为 while [[ $# > 0 ]]

【讨论】:

  • 感谢您的解释!错误#1 ...让我们忘记那个吗?好的!错误 #2 和 #3 也适用...调用 (venv)edwin@edwin:/project/installs/$ source install_database.sh 带或不带 -r -m 都导致真假?知道为什么吗?
  • @Nrzonline 这可能是错误 #4,但我不会添加它,因为我也不是 bash 专家。无论如何:在 while 循环之前将两个变量初始化为 false 是个好主意(如果没有必要)。
  • 对于#2,内部shifts 对于接受选项的版本是正确的,对于无选项版本是不正确的。这是脚本需要在内部处理的复杂情况,要么通过测试前导 - 的下一个选项,要么要求将标志值“拥抱”到标志(即不是 -r test 而是 -rtest)。跨度>
  • OP 想要 -gt 0 而不是 > 0。数值比较不是字符串比较。
猜你喜欢
  • 1970-01-01
  • 2022-11-22
  • 2016-03-10
  • 1970-01-01
  • 2010-10-05
  • 2021-11-25
  • 1970-01-01
  • 2016-07-29
  • 2019-07-14
相关资源
最近更新 更多