我正在尝试从bash数组中提取值。如果是下面的代码就可以正常工作-
### stk3.sh
#!bin/bash
declare -x -A my_ids
my_ids[cat]=100
my_ids[dog]=200
id_key=${1:-cat} ## setting default
echo "Id key is :${id_key}"
id_no=${my_ids[$id_key]}
echo "Value is ### ${id_no}"
字符串
如果我执行上面的命令,我会得到所需的输出-(将上面的脚本保存在stk3.sh中)
./stk3.sh dog
Id key is :dog
Value is ### 200
型
现在,当我使用函数时,我无法获得所需的输出。在一个脚本(stk1.sh)中定义函数,并调用该函数从另一个脚本(stk2.sh)中的特定键获取值
### stk1.sh
#!/bin/bash
declare -x -A my_ids
function my_ids {
my_ids[cat]=100
my_ids[dog]=200
echo "Length of Array :${#my_ids[*]}"
echo "*** Now printing the contents of the Array ...."
for x in "${!my_ids[@]}"
do
printf "$x ${my_ids[$x]} \n"
done
}
my_ids
function get-value {
printf "$1\n"
if [[ -n "$1" ]]
then
id_no=${my_ids[$id_key]}
fi
}
型
当使用调用函数时,我没有得到想要的结果-这里是我的stk2.sh
### stk2.sh
#!/bin/bash
source stk1.sh
id_key=${1:-cat} ## setting default
echo "Id key is :${id_key}"
id_no=$(get-value $id_key)
echo "Value is ### ${id_no}"
型
执行skt2.sh后的输出,正如你所看到的,它没有返回id _no的值,在本例中应该是200:
./stk2.sh dog
Length of Array :2
*** Now printing the contents of the Array ....
dog 200
cat 100
Id key is :dog
Value is ### dog
型
4条答案
按热度按时间1hdlvixo1#
id_no
是在get-value()
函数调用中设置的,由于您没有将id_no
定义为函数的“本地”,因此id_no
的新值将自动可用于调用/父进程。你要做的是调用函数而不试图捕获它的输出,例如:
字符串
d7v8vwbk2#
get-value
分配id_no
的值并输出输入。但是主脚本指定id_no
保存get-value
的输出,这是您传入的密钥。不是你想要的行为。试试看
字符串
如果var为null或未设置,
${var:?error-message}
将发出错误消息,并生成错误状态。参见https://www.gnu.org/software/bash/manual/bash.html#Shell-Parameter-Expansion然后主脚本可以有
型
axzmvihb3#
你想做的事情是不可能的。在bash中,你不能返回不是函数退出代码的东西。This answer讨论替代方案。
stk2.sh中的
id_no=$(get-value $id_key)
行捕获了该命令的所有输出(在子shell中使用$(...)
启动该命令),在本例中,该命令由stk1.sh中的printf "$1\n"
行确定。Here是另一个关于bash函数返回值的有见地的讨论。
pxy2qtax4#
你的get-value函数...
字符串
...打印它的第一个参数(“$1”),然后,如果后者非空,则将
my_ids[$id_key]
的值赋给变量id_no
。这就引出了几个问题:
1.为什么你的
get-value
函数会操作那些没有作为参数传递的变量?get-value
在 command substitution 语句中被调用:它运行在一个子shell中,带有父环境的副本。当然,它 * 将 * 能够访问id_key
的值,因为id_key
碰巧在stk2.sh
中更早定义,但是检查第一个函数参数(“$1”)是否为空有什么用呢?1.你关于
id_no
的赋值语句将 * 不 * 反映在父环境中。它只在get-value
的子shell运行期间存在。1.你滥用了命令替换功能
$(get-value $id_key)
将被替换为在子shell运行期间打印到STDOUT的任何内容。因为你的函数执行printf "$1\n"
,所以它实际上返回(作为替换字符串)它的第一个参数的值。所以如果id_key
是“cat”,则$(get-value $id_key)
返回“cat”。总结一下(假设
stk2.sh
调用为./stk2.sh dog
:型
简单的建议:
型
希望能帮上忙。