【问题标题】:Pass empty variable in bash在bash中传递空变量
【发布时间】:2013-10-22 23:41:53
【问题描述】:

我的问题:

#!/bin/bash

function testFunc(){
    echo "param #1 is :" $1
    echo "param #2 is :" $2
}

param1="param1"
param2="param2"

testFunc $param1 $param2

这样输出是:

param #1 is : param1
param #2 is : param2

但是当我将 param1 设置为空字符串时:

param1=""

那么输出如下:

param #1 is : param2
param #2 is :

我想问题是当第一个参数为空时,它没有被声明,所以它实际上并没有作为函数参数传递。

如果这是问题所在,那么有没有办法在 bash 中声明一个变量“空字符串”,或者是否有任何解决方法来获得预期的行为?

注意:如果我这样调用函数,它会按预期工作:

testFunct "" $param2

但我想保持代码干净。

更新:

我最近发现了-u 标志,它会在即将使用未绑定变量的情况下引发错误。

$ bash -u test.sh
param #1 is : param1
test.sh: line 5: $2: unbound variable

【问题讨论】:

  • 清洁不应覆盖正确性。
  • 所以你更喜欢保持正确的混乱状态,而不是寻找干净正确的解决方案?
  • 如果代码不正确,谁在乎它是否干净?不引用参数扩展,因为您认为它看起来更干净是不正确的。
  • 再次阅读我的问题:D 我的问题是,我必须在没有参数名称的情况下调用我的函数才能使其工作。所以我搜索了一个可以保留参数名称的解决方案。一个干净且正确的解决方案。

标签: bash parameter-passing string


【解决方案1】:

在第一种情况下,您使用testFunct param2 调用脚本。因此,它将param2 理解为第一个参数。

始终建议在引号内传递参数以避免这种情况(老实说,对我来说,这种方式更干净)。所以你可以调用它

testFunct "$param1" "$param2"

所以要传递一个空变量,你说:

testFunct "" "$param2"

看一个例子:

给定这个函数:

function testFunc(){
    echo "param #1 is -> $1"
    echo "param #2 is -> $2"
}

让我们用不同的方式来称呼它:

$ testFunc "" "hello"    # first parameter is empty
param #1 is -> 
param #2 is -> hello

$ testFunc "hey" "hello"
param #1 is -> hey
param #2 is -> hello

【讨论】:

  • 有些人会争辩说,理想情况下,即使在echo 命令中的$1$2 也应该被引用。
【解决方案2】:

另一个最佳做法是检查使用 $# 传递的参数数量。

但是,这并不能解决一个空参数的问题,你怎么知道param1是空的还是param2是空的。因此,这两种支票都是不错的选择。

【讨论】:

  • 阅读我的问题的更新部分,它提供了一种更强大的方法来捕获这些错误。
【解决方案3】:

可以在正文中添加set -o nounset bash 文件,以达到与bash -u 相同的效果。

#!/bin/bash
set -o nounset

function testFunc(){
    echo "param #1 is :" $1
    echo "param #2 is :" $2
}

param1="param1"
param2="param2"

testFunc $param1 $param2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多