如何让脚本从属性文件读取值并将其传递给相同的脚本?

问题描述:

我是linux shell脚本的新手。我想,我的脚本读取属性文件并保存价值的任何变化,我可以在同一个脚本传递相同.. 我写剧本不履行我的要求:如何让脚本从属性文件读取值并将其传递给相同的脚本?

!/bin/bash 

. test1 

flat 

if [ "$1" == test1 ]; then 
    flat=$1; /assign value to var flat 
    echo "flat"   
fi 

test1的是属性文件其中包括:

la=12 

tu=15 

现在我想当我运行:

./myscript la 

它从属性文件中读取并存储在平坦变量的值。 请帮帮我。

+0

如果你想'flat'到'myscript'返回后,有它的壳价值,你就必须采购它,而不是:'源。/myscript la'或'。 ./myscript la'。 – chepner 2012-07-17 15:29:43

如果我理解正确,您希望实现间接变量解引用(请参阅,例如this example)。

的解决方案是使用eval

eval flat=\$$1 
+0

您可以使用var = $ 1来消除可能不安全的'eval';平= $ {!VAR}'。 (想象一下,如果第一个参数是“3 rm -rf /”) – chepner 2012-07-17 13:11:58

+0

说实话,我看不出你的例子有什么大问题。 'flat'会得到内容“3 rm -rf /”。 – bmk 2012-07-17 13:36:50

+0

它扩展为“eval flat = \ $ 3 rm -rf /”。现在你正在评估一个简单的命令,在其环境中使用'flat'。试试'foo(){eval flat = \ $$ 1; }; foo“3 ls”' – chepner 2012-07-17 13:53:36

你只需要使用间接引用,但要做到这一点,你需要特殊参数$1的价值首先存储在常规参数。

!/bin/bash 

. test1 

var="$1" 

# Only assign to flat if the variable specified in var is defined 
if [ -n "${!var:-}" ]; then 
    flat="${!var}"; # assign value to var flat 
    echo "flat"   
fi 

首先,${!var}膨胀到其名称是在var的变量的值。如果var是“foo”,则与$foo相同。如果var是“baz”,则与$baz相同。

${var:-default}膨胀到的var值,如果它被设置,并且具有非空值。否则,它会扩展到': - '之后的任何内容,在这种情况下是字符串默认值。如果没有字符串,则使用空值。因此如果var未设置(或者已经是空字符串),则${var:-}将展开为空字符串。

将两者结合,${!var:-}取变量var,并将其值用作变量名称。然后尝试展开该变量,如果未设置或为空,则展开为空字符串。因此,如果varla,它将展开为值la。如果varre,并且没有设置变量re,则它将展开为空字符串。

最后,-n运算符测试它的参数是否为非零长度。换句话说,它检查试图扩展名称为var的变量的结果不是空字符串。如果这是真的,那么再次展开它(是的,这有点多余),并将其值分配给flat

由于上面写了答案,如果脚本的参数不是在test1中设置的变量的名称,则变量flat未定义。如果您不介意flat被设置,无论(比如说,flat=""),您不需要if语句。你可以只用一条线来设置的flat值:

#!/bin/bash 
. test1 
var="$1" 
flat="${!var:-}" 
+0

非常感谢....它的工作原理...... 如果可能,请您向我解释说明: if [-n“$ {!var: - }”];那么 它究竟在干什么....它会对我有帮助... 再次感谢。 – SteveScm 2012-07-17 13:58:19

+0

不客气!当你有机会时,一定要接受答案。 – chepner 2012-07-17 13:59:23