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

时间:2012-07-17 12:42:50

标签: bash

我是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

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

2 个答案:

答案 0 :(得分:6)

您只需要使用间接引用,但为此,您需要首先将特殊参数$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:-}的值。否则,它会扩展为': - '之后的任何内容,在这种情况下是字符串默认值。如果没有字符串,则使用null值。因此,如果未设置var(或者已经是空字符串),${!var:-}将扩展为空字符串。

结合两者,var获取变量var,并将其值用作变量名。然后它尝试扩展该变量,如果未设置或为null,则展开为空字符串。因此,如果lala,则会扩展为var的值。如果rere,并且未设置变量-n,则会扩展为空字符串。

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

如上所述,如果脚本的参数不是test1中变量集的名称,则变量flat未定义。如果您不介意设置flat=""(例如if),则不需要flat语句。您只需使用一行来设置#!/bin/bash . test1 var="$1" flat="${!var:-}" 的值:

{{1}}

答案 1 :(得分:-1)

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

解决方案是使用eval

eval flat=\$$1