【问题标题】:Arguments with space when parsing input parameters for bash script解析 bash 脚本的输入参数时带空格的参数
【发布时间】:2017-01-10 03:21:34
【问题描述】:

我编写了一个 bash 脚本,它按名称获取参数并以键值对的形式读取其值。下面是我如何运行脚本的示例。

 sh test.sh param1='a' param2='b'

然后,我在脚本中引用 $param1 和 $param2 等输入参数。下面是我为此编写的脚本。

for item in $@; do
case $item in
(*=*) eval $item;;
esac
done

但是当参数的值中有空格时,它只取空格之前的部分。

 param3='select * from'

只会将 'select' 分配给 param3 而不是整个字符串。我怎样才能做到这一点?任何帮助将不胜感激。

编辑:

在伊尼安的回答之后

for item in $@; do
case "$item" in
(*=*) eval "$item";;
esac
done

【问题讨论】:

  • 您是否考虑过将它们作为变量传递,例如 param1='a' param2='b' sh test.sh?这将使echo "$param1" 无需解析即可立即使用
  • 使用 $@ 或 $* 而不用双引号括起来不是一个好主意。当您的字符串中包含特殊字符(如空格和通配符)时,它会出现异常。

标签: linux bash shell terminal ubuntu-16.04


【解决方案1】:

您可以通过引用"$@" 并使用declare 而不是eval 来做到这一点:

for item in "$@"; do
case $item in
(*=*) declare "$item" ;;
esac
done

但是,现在这是一个 bash 脚本,因此您必须使用 bash test.sh 而不是 sh test.sh 运行它

【讨论】:

  • 成功了!但正如您在评论中指出的那样,在 "sh " 之后和 "sh 之前指定参数有什么区别?抱歉,我是新手。
  • @mayooran:如果您在命令之前指定它们,它们会被调用shell解释为环境变量赋值,因此它们可以直接在脚本中使用。如果你把它们放在后面,它们会被解释为字符串,以 $1$2 等形式传递给脚本,然后你必须做一些非标准和奇怪的事情来将它们变成变量赋值。脚本接受参数的正常方式是按标准顺序作为裸字符串(例如sh test.sh val1 val2),或者使用- 选项来指定它们(例如sh test.st -a val1 -b val2)。
  • @GordonDavisson 哦,知道了,伙计!多谢! :) :)
猜你喜欢
  • 2014-06-05
  • 2015-12-25
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
  • 2013-06-10
  • 1970-01-01
  • 2013-04-21
相关资源
最近更新 更多