使用“read”设置变量

时间:2016-02-14 05:24:17

标签: linux macos bash variables

在CLI的bash我可以这样做:

$ ERR_TYPE=$"OVERLOAD"
$ echo $ERR_TYPE
OVERLOAD
$ read ${ERR_TYPE}_ERROR
1234
$ echo $OVERLOAD_ERROR
1234

这非常适合动态设置变量名称;在脚本中它不起作用。我试过了:

#!/bin/env bash

ERR_TYPE=("${ERR_TYPE[@]}" "OVERLOAD" "PANIC" "FATAL")

for i in "${ERR_TYPE[@]}"
do
   sh -c $(echo ${i}_ERROR=$"1234")
done
echo $OVERLOAD_ERROR # output is blank

   # I also tried these:
   # ${i}_ERROR=$(echo ${i}_ERROR=$"1234") # command not found
   # read ${i}_ERROR=$(echo ${i}_ERROR=$"1234") # it never terminates

我如何设置变量,就像在CLI中一样,但是在脚本中?感谢

3 个答案:

答案 0 :(得分:2)

当您使用动态变量名称而不是关联数组时,您确实需要质疑您的方法。

err_type=("OVERLOAD" "PANIC" "FATAL")
declare -A error
for type in "${err_type[@]}"; do
    error[$type]=1234
done

然而,在bash中你会使用declare

declare "${i}_error=1234"

您的方法失败,因为您生成了一个新shell,传递了命令OVERLOAD_ERROR=1234,然后shell退出。您当前的shell根本不受影响。

摆脱使用ALLCAPSVARNAMES的习惯。有一天你会写PATH=...,然后想知道为什么你的脚本坏了。

答案 1 :(得分:1)

我使用eval。 我认为这会被认为是不好的做法(它与eval是"邪恶"因为它允许输入错误或其他东西这一事实有关:

eval "${i}_ERROR=1234"

答案 2 :(得分:1)

如果变量将包含数字,则可以使用let

#!/bin/bash

ERR_TYPE=("OVERLOAD" "PANIC" "FATAL")

j=0
for i in "${ERR_TYPE[@]}"
do
  let ${i}_ERROR=1000+j++
done
echo $OVERLOAD_ERROR
echo $PANIC_ERROR
echo $FATAL_ERROR

输出:

1000
1001
1002