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

Bash 如何使脚本从属性文件读取值并将其传递给同一脚本?,bash,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 现在我想在跑步时: ./mysc

我不熟悉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
它从属性文件中读取并将值存储在平面变量中。
请帮助我。

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

解决方案是使用
eval

eval flat=\$$1

您只需要使用间接引用,但要做到这一点,您需要首先将特殊参数
$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,并将其值用作变量名。然后它尝试展开该变量,如果未设置或为null,则展开为null字符串。因此,如果
var
la
,它将扩展为
la
的值。如果
var
re
,且未设置变量
re
,则会扩展为空字符串

最后,
-n
操作符测试其参数的长度是否为非零。换句话说,它检查尝试展开名为
var
的变量的结果是否不是空字符串。如果这是真的,那么再次展开它(是的,它有一点冗余),并将其值指定给
平面

如上所述,如果脚本的参数不是
test1
中设置的变量名,则变量
flat
是未定义的。如果您不介意设置
flat
(例如,
flat=”“
),则不需要
If
语句。您可以只使用一行设置
平面的值

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

您可以使用
var=$1消除可能不安全的
eval
;flat=${!var}
。(想象一下,如果第一个参数是“3rm-rf/”),老实说,我认为您的示例没有什么大问题
flat
将获得内容“3rm-rf/”。它将扩展为“eval flat=\$3rm-rf/”。现在,您正在评估一个在其环境中使用
flat
的简单命令。尝试
foo(){eval flat=\$$1;};foo“3 ls”
非常感谢您……它很有效。。。。。。如果可能的话,请你给我解释一下:if[-n“${!var:-}”];那它到底在做什么…这对我会有帮助。。。再次感谢,不客气!当你有机会的时候,一定要接受正确的答案。如果你想在
myscript
返回后
flat
在shell中有它的值,你就必须将它的来源改为:
source./myscript la
/myscript la