在bash中传递空变量

kup*_*sef 19 string bash parameter-passing

我的问题:

#!/bin/bash

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

param1="param1"
param2="param2"

testFunc $param1 $param2
Run Code Online (Sandbox Code Playgroud)

这样输出是:

param #1 is : param1
param #2 is : param2
Run Code Online (Sandbox Code Playgroud)

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

param1=""
Run Code Online (Sandbox Code Playgroud)

然后输出如下:

param #1 is : param2
param #2 is :
Run Code Online (Sandbox Code Playgroud)

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

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

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

testFunct "" $param2
Run Code Online (Sandbox Code Playgroud)

但我想保持代码清洁.

更新:

我最近发现-u了一个标志,如果即将使用未绑定的变量,它会引发错误.

$ bash -u test.sh
param #1 is : param1
test.sh: line 5: $2: unbound variable
Run Code Online (Sandbox Code Playgroud)

fed*_*qui 33

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

总是建议在引号内传递参数以避免这种情况(说实话,对我来说这样更清洁).所以你可以打电话给它

testFunct "$param1" "$param2"
Run Code Online (Sandbox Code Playgroud)

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

testFunct "" "$param2"
Run Code Online (Sandbox Code Playgroud)

看一个例子:

鉴于此功能:

function testFunc(){
    echo "param #1 is -> $1"
    echo "param #2 is -> $2"
}
Run Code Online (Sandbox Code Playgroud)

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

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

$ testFunc "hey" "hello"
param #1 is -> hey
param #2 is -> hello
Run Code Online (Sandbox Code Playgroud)