[英]bash script copy output from set -x to file, called from within script rather than using tee
[英]copy the value of the variable rather than reference bash script
我对bash脚本有点陌生。 所以,请忍受我。 我试图创建一个表,并在for循环中分配值,如下所示:
packages=("foo" "bar" "foobar")
packageMap=()
function test() {
i=0;
for package in "${packages[@]}"
do
echo $i
packageMap[$package]=$i
i=$(expr $i + 1)
done
}
test
echo the first value is ${packageMap["foo"]}
输出为:
0
1
2
the first value is 2
虽然我的预期输出是:
0
1
2
the first value is 0
因此,基本上将变量的引用分配给该变量而不是值。 如何解决呢?
我的bash版本:
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16)
TIA
bash
3.2仅具有索引数组,因此,如果$package
是整数而不是任意字符串,则packageMap[$package]
仅packageMap[$package]
预期工作。
(您观察到的是$package
在算术上下文中求值,其中foo
, bar
和foobar
递归扩展,直到获得整数值为止。未定义的变量扩展为0,所以packageMap[foo]
等同于packageMap[0]
。)
如果您使用的是bash
4或更高版本,则可以使用关联数组:
packages=("foo" "bar" "foobar")
declare -A packageMap
test () {
i=0
for package in "${packages[@]}"
do
echo $i
packageMap[$package]=$i
i=$(($i + 1))
done
}
鉴于i
与packages
中每个元素的索引相同,您还可以编写
test () {
for i in "${!packages[@]}"; do
package=${packages[i]}
packageMap[$package]=$i
done
}
而不是显式增加i
。
正如chep所说,bash 3中没有关联数组。也就是说,如果您不介意浪费一点CPU,则可以使用函数来达到类似的效果:
#!/bin/bash
packages=("foo" "bar" "foobar")
function packagemap () {
local i
for i in "${!packages[@]}"; do
[[ ${packages[$i]} = $1 ]] && echo "$i" && return
done
echo "unknown"
}
echo "the first value is $(packagemap "foo")"
${!array[@]}
构造扩展为数组的索引集,对于通常不相关的数组,该数组由从0开始的递增整数组成。但是可以删除数组成员而无需重新编号索引(即未unset packages[1]
索引) unset packages[1]
),因此重要的是能够引用实际索引,而不是假设它们与简单计数的for循环是连续的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.