【问题标题】:Bash function argument from variable来自变量的 Bash 函数参数
【发布时间】:2021-11-14 11:54:32
【问题描述】:

考虑以下代码,其中我定义了两个函数,func1func2

func1 () {
    local FLAGS=${1}
    echo "func1 $FLAGS"
}

func2 () {
    local FLAGS=${1}
    echo "func2 $FLAGS"
    func1 $FLAGS
}

FLAGS="-p -i"
func1 $FLAGS
func2 $FLAGS

func1 "-p -i"
func2 "-p -i"

目的是向他们传递一个参数,在本例中为FLAGS="-p -i"。我希望上面的所有四个调用都是等价的。但是,这是我得到的输出:

func1 -p
func2 -p
func1 -p
func1 -p -i
func2 -p -i
func1 -p

这告诉我,无论何时将参数保存到变量中,都会对其进行解析,并且仅将前空白部分传递给函数。我的问题是为什么会发生这种情况以及如何将整个 $FLAG 参数传递给函数,无论它是否包含空格?

【问题讨论】:

  • 你应该几乎总是在变量(和参数)引用周围加上双引号,以避免像这样奇怪的解析问题。请参阅 "When should I double-quote a parameter expansion?" Shellcheck.net 擅长发现此类常见错误。顺便说一句,我还建议使用小写或混合大小写的变量名称,因为有很多具有特殊含义的全大写名称,并且错误地重复使用其中之一也会导致问题。
  • @Botond:使用func1 "-p -i",您将(由于引号)single 参数-p -i 传递给您的函数。使用func1 $FLAGS,shell 首先扩展变量FLAGS,并对扩展进行分词,得到func1 -p -s。这样你就传递了两个参数,-p-s

标签: bash


【解决方案1】:

我的问题是为什么会这样

这就是它的工作原理。

以及如何将整个 $FLAG 参数传递给函数

像这样:

func1 "$FLAGS"
func2 "$FLAGS"

或者像这样改变你的函数:

func1 () {
    local FLAGS=${@}
    echo "func1 $FLAGS"
}

func2 () {
    local FLAGS=${@}
    echo "func2 $FLAGS"
    func1 $FLAGS
}

【讨论】:

    【解决方案2】:

    改变

    func1 $FLAGS
    

    func1 "$FLAGS"
    

    没有引号,'-p' 是 $1,'-i' 是 $2

    【讨论】:

      猜你喜欢
      • 2018-10-28
      • 2018-08-15
      • 1970-01-01
      • 2018-07-15
      • 2013-03-28
      • 2011-11-25
      • 2023-03-17
      • 1970-01-01
      • 2022-06-20
      相关资源
      最近更新 更多