修改函数bash中switch语句内的空字符串变量

修改函数bash中switch语句内的空字符串变量

所以我在 bash 中有这个函数,它接收一个空字符串变量作为第一个参数,接收一个字符作为第二个参数,

function check_cases {
    case $2 in
        r) $1=$(echo "$1 Read");;
        w) $1=$(echo "$1 Write");;
        x) $1=$(echo "$1 Execution");;
    esac
}

我尝试过各种不同的方法来连接字符串变量,但它总是说

=: command not found

关于 = 运算符。我在函数内创建并清空本地字符串变量,例如

local var=""

并用字符变量传递它

check_cases "$var" "$char"

我想了解发生了什么事以及如何解决这个问题。

答案1

看起来你正在尝试做一个通过引用传递类型函数。

这些实际上不太适合bash脚本编写。我们可以伪造的它与eval命令一起使用,但这有很多危险行为(可能评估嵌入字符串中的命令),因此不建议这样做。

例如,代码如下所示:

function check_cases {
    case $2 in
        r) eval $1=\"\$$1 Read\" ;;
        w) eval $1=\"\$$1 Write\" ;;
        x) eval $1=\"\$$1 Execution\" ;;
    esac
}

check_cases var r
check_cases var w
check_cases var x

echo $var

相反,通常更好地使用按值传递语义;只需返回您想要的值并将调用者将其附加到变量即可。

例如

function check_cases {
    case $1 in
        r) echo " Read" ;;
        w) echo " Write" ;;
        x) echo " Execution" ;;
    esac
}

var="$var$(check_cases r)"
var="$var$(check_cases w)"
var="$var$(check_cases x)"

echo $var

答案2

目前尚不清楚你想要实现什么,但无论如何......

首先,赋值的语法不是

$val=value

val=value

无论如何

1=value

不起作用,因为变量名不能以数字开头。

要将值分配给位置参数,请执行以下操作:

function check_cases {
    case $2 in
        r) append=' Read';;
        w) append=' Write';;
        x) append=' Execution';;
    esac
    set "$1""$append" "$2" # notice no space between "$1" and "$append"
    echo "$@" # print all parameters
    echo Number of parameters: $#
}

相关内容