首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash:通过包含名称中的模式的变量循环

Bash:通过包含名称中的模式的变量循环
EN

Stack Overflow用户
提问于 2014-09-10 12:17:40
回答 2查看 10.7K关注 0票数 6

在我的脚本中,我有一个未知数量的变量,其中包含了我想要转换成向量的角度。我设置了变量名,使得每个“参数”的角度都是形式:{ parameter }_angle_{lat/perp}因此,每个参数都有一个'lat‘和'perp’角变量。所以我要做的是找到所有包含‘_angle’的变量,对这些变量的值做一些计算,并创建一个新的变量,其中包含‘参数’-名称。例如:

代码语言:javascript
复制
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

我希望我在这里的目标是清楚的。谢谢你的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-10 12:21:01

您可以做的是使用env获取所有变量的列表,然后迭代它们:

代码语言:javascript
复制
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)
票数 16
EN

Stack Overflow用户

发布于 2014-09-10 12:45:44

此代码要求bash 4.3使用declare -n创建的命名引用。

这也要求您稍微重命名变量。

代码语言:javascript
复制
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。(实际上,情况并没有我想象的那么糟糕。)

代码语言:javascript
复制
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 )。它更简单,主要是因为它放弃了对一组相似变量名的迭代。

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25765282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档