在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中一样,但是在脚本中?感谢
答案 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