Linux shell脚本:是否可以将作为参数发送的变量修改为函数?

时间:2014-12-19 15:21:21

标签: bash function variables parameters

我对linux shell脚本有点新意,所以这可能是一个非常愚蠢的问题。

这是一个简单的示例代码(当然它不起作用,但我希望展示我想做的事):

#!/bin/bash 
function AppendLetters() {
  # Value sent as parameter: $1
  $1= "$1"LLL
}
var="foo"
AppendLetter $var
echo "$var"

因此,从命令行调用程序时:

$ ./example.sh

我想修改内部变量某种:

fooLLL
执行此操作的

原因:我有一个脚本可以从配置文件加载多个变量,并希望进行相同的修改对于那些变量,以便在我的程序中使用它们。

有可能吗?函数可以修改作为参数发送的变量吗?

2 个答案:

答案 0 :(得分:2)

从Bash 4.3.0开始,您可以使用declare -n获取函数中变量的引用

AppendLetters() {
   declare -ln ref="$1"
   ref+="LLL"
}

var="foo"
AppendLetters "var"

echo "$var"
fooLLL

来自help declare

-n  make NAME a reference to the variable named by its value

编辑:感谢@gniourf_gniourf建议此printf,您可以在旧版BASH中执行此操作:

AppendLetters() { printf -v "$1" '%sLLL' "${!1}"; }

var="foo"
AppendLetters "var"

echo "$var"
fooLLL

答案 1 :(得分:2)

不需要bash 4.3,使用variable indirection

AppendLetters() {
  declare -g "$1"="${!1}LLL"
}

var=f00
AppendLetters var
echo "$var"
f00LLL

声明的-g选项是必要的,这样就不会将赋值视为函数的本地。


假设:

  

我有一个脚本从配置文件加载多个变量,并希望对这些变量进行相同的修改,以便在我的程序中使用它们。

我会使用bash' +=赋值运算符

来执行此操作,而不是使用函数
varlist=( var1 var2 var3 )
for varname in "${varlist}"; do
    declare "$varname"+="LLL"
done