在我的脚本中,我有一个未知数量的变量,包含我想要转换为矢量的角度。我制作了变量名,以便每个参数的角度为'具有以下形式: {参数} _angle_ {纬度/ PERP} 因此,每个参数都有一个' lat'和' perp'角度变量。 所以我想要做的是找到包含' _angle_lat'的所有变量,对这些变量的值进行一些计算,并创建一个包含'参数' -name的新变量。 例如:
export M0_angle_lat=4
export M1_angle_lat=70
export M1_angle_perp=8
export M0_angle_perp=90
# Now I want to use these values to calculate vectors
for varname in *_angle_lat
do
# at first iteration it will get for example "varname=M0_angle_lat" in which case
# I want it to do:
M0_X=$(( $M0_angle_lat * $M0_angle_perp ))
# The second iteration in case would then give "varname=M1_angle_lat" in which case
# I want it to do:
M1_X=$(( $M1_angle_lat * $M1_angle_perp ))
done
我希望明白我的目标是什么。谢谢你的帮助!
答案 0 :(得分:9)
您可以使用env
获取所有变量的列表,然后遍历它们:
while IFS='=' read -r name value ; do
if [[ $name == *'_angle_lat'* ]]; then
echo "$name" ${!name}
prefix=${name%%_*} # delete longest match from back (everything after first _)
angle_lat="${prefix}_angle_lat"
angle_perp="${prefix}_angle_perp"
result="${prefix}_X"
declare "${result}=$(( ${!angle_lat} * ${!angle_perp} ))"
fi
done < <(env)
答案 1 :(得分:1)
此代码需要bash
4.3,才能使用declare -n
创建的命名引用。
这也要求您稍微重命名变量。
angle_lat_M0=4
angle_lat_M1=70
angle_perp_M1=8
angle_perp_M0=90
# Now I want to use these values to calculate vectors
for varname in ${!angle_lat*}
do
# Ref to angle_lat_*
declare -n lat=$varname
# Ref to angle_perp_*
declare -n perp=${varname/_lat_/_perp_}
# Ref to X_*
declare -n x=${varname/angle_lat_/X_}
x=$((lat * perp))
done
echo $X_M0
echo $X_M1
在4.3之前,你需要一些额外的技巧才能工作varname
。 (实际上,它并没有我想象的那么糟糕。)
angle_lat_M0=4
angle_lat_M1=70
angle_perp_M1=8
angle_perp_M0=90
# Now I want to use these values to calculate vectors
for varname in ${!angle_lat*}
do
tag=${varname#angle_lat_} # M0, M1, etc
lat=${!varname}
perp_name=angle_perp_$tag
perp=${!perp_name}
x=$((lat * perp))
declare "X_$tag=$x"
done
echo $X_M0
echo $X_M1
更简单,它应该适用于bash
的所有版本(可能不包括在内)
一些非常旧的版本,但至少支持3.2)。它更简单,主要是因为
它放弃了试图迭代一组类似的变量名称。
lats=( $M0_angle_lat $M1_angle_lat )
perps=( $M0_angle_perp $M1_angle_lat )
declare -a x
for i in "${!lats[@]}"; do
x+=(${lats[i]} * ${perps[i]})
done
M0_X=${x[0]}
M1_X=${x[1]}
# or
for i in "${!x[@]}"; do
declare "M${i}_X"=${x[i]}
done