-2

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

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

4

2 回答 2

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}展开到名称为 in 的变量的值var。如果var是“foo”,则与$foo. 如果var是“baz”,则与$baz.

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

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

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

正如上面写的答案,flat如果脚本的参数不是设置在test1. 如果您不介意flat被设置(例如,flat=""),则不需要该if语句。您可以只使用一行来设置的值flat

#!/bin/bash
. test1
var="$1"
flat="${!var:-}"
于 2012-07-17T13:25:40.370 回答
-1

如果我理解正确,您希望实现间接变量取消引用(例如,参见此示例)。

解决方案是使用eval

eval flat=\$$1
于 2012-07-17T13:07:17.523 回答