重击:循环遍历名称中包含模式的变量 [英] Bash: loop through variables containing pattern in name

查看:69
本文介绍了重击:循环遍历名称中包含模式的变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的脚本中,未知数量的变量包含要转换为矢量的角度.我设置了变量名称,以使每个参数"的角度具有以下形式: {parameter} _angle_ {lat/perp} 因此,每个参数都有一个"lat"和"perp"角度变量. 因此,我要做的是找到所有包含"_angle_lat"的变量,对这些变量的值进行一些计算,然后创建一个包含"parameter"名称的新变量. 例如:

In my script I have an unknown number of variables containing angles which I want to convert to vectors. I made the variable-names such that the angles of each 'parameter' are of the form: {parameter}_angle_{lat/perp} Hence, each parameter has a 'lat' and 'perp' angle variable. So what I want to do is to find all variables containing '_angle_lat', do some calculations on the values of these variables and create a new variable which contains the 'parameter'-name in it. for example:

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

我希望我的目标很明确.感谢您的帮助!

I hope it's clear what my goal is here. Thanks for the help!

推荐答案

您可以使用env获取所有变量的列表,然后遍历它们:

What you can do is use env to get a list of all variables and then iterate through them:

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)

这篇关于重击:循环遍历名称中包含模式的变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆