如何从变量中读取符号分隔的字符串、转换为数字并执行算术运算?

如何从变量中读取符号分隔的字符串、转换为数字并执行算术运算?

在 bash 脚本中,我希望传入一个包含在变量中的字符串,该字符串最多包含 3 个子字符串,每个子字符串之间用“+”符号分隔。每个子字符串都有一个特定的数值,有点像八进制模式。

我想将字符串拆分成子字符串,将它们转换为数值,然后将这些值相加。

例如如果我的子字符串和值是:

  • 帽子 = 1
  • 衬衫 = 2
  • 裤子 = 4

我的变量在字符串中包含这些内容:

my_outfit=shirt+trousers

我想要一个变量,其outfit_value值为 6。我该如何做呢?

我曾考虑过将其设置IFS为“+”,并将变量读入数组,然后循环遍历数组并将每个元素转换为其值。不幸的是,当我想到检索这些数值元素并进行算术表达式时,我的脑袋就变成了蛋奶糊。

编辑:

这是我目前所做的,它似乎有效,但我想知道是否存在任何问题,或者是否可以更安全/有效地完成:

my_outfit=hat+shirt+trousers

oIFS=$IFS
IFS=+
read -a clothes <<< "$my_outfit"
IFS=$oIFS

outfit_value=0

for string in ${clothes[@]}
do
   if [[ $string = "hat" ]]
   then
      add_value=1
   elif [[ $string = "shirt" ]]
   then
      add_value=2
   elif [[ $string = "trousers" ]]
   then
      add_value=4
   fi
   let outfit_value="$outfit_value"+"$add_value"
done

echo "OUTFIT VALUE is $outfit_value"

答案1

使用 bash,在算术评估上下文中,变量名不需要前缀$。这意味着这是可能的:

# set up the variables
hat=1 shirt=2 trousers=4
string="my_outfit=shirt+trousers"

# evaluate the equation 
(( $string ))

echo $my_outfit

输出

6

答案2

这是原始方法的变体,但使用了 bash 数组。请注意,无需保存和恢复字段分隔符 - 您只需在read字符串

#!/bin/bash

# create a map (lookup table) from items to values
declare -A values=( [hat]=1 [shirt]=2 [trousers]=4 )
# (an ASSOCIATIVE array)

my_outfit='hat+shirt+trousers'

# convert the string to a simple (INDEXED) array
IFS=+ read -r -a my_items <<< "$my_outfit"

# loop over the array of items, looking up and summing the values 
outfit_value=0
for item in "${my_items[@]}"; do
  ((outfit_value += values[$item]))
done

printf 'OUTFIT VALUE is %s\n' "$outfit_value"

相关内容