總結:整理不易,如果對你有幫助,可否點贊關注一下?
更多詳細內容請參考:Linux運維實戰總結
一、變量間接調用
在Shell腳本中,變量間接調用是一種高級特性,它允許你通過另一個變量的值來動態地訪問另一個變量的值。這在處理復雜的腳本或需要靈活處理變量名稱時非常有用。
使用eval時要特別小心,因為它會執行字符串中的所有內容,這可能導致安全風險。盡量避免在不完全控制輸入的情況下使用eval。
!符號和declare -n是更安全、更推薦的方法,特別是當你需要處理復雜的變量引用時。在使用這些高級特性時,確保你的Bash版本支持這些功能(例如,declare -n需要Bash 4.3及以上版本)。可以通過運行bash --version來檢查你的Bash版本。
1.1、方法一:使用eval命令
#!/bin/bash
export CPU_PLATFROM="aarch64"
export OS_NAME="kylin"
export API_SERVER_HOST="192.168.1.111"
export API_SERVER_PORT="6443"
var_arrs=(CPU_PLATFROM OS_NAME API_SERVER_HOST API_SERVER_PORT)for var in ${var_arrs[@]}
do var2=`eval echo '$'"$var"`if [[ -z "${var2}" ]] ; thenecho "${var} is empty!"elseecho "${var} is $var2"fi
done
執行結果,如下所示:
root@k8s-master-58:~# ./check.sh
2025-08-12 15:47:01 Info: CPU_PLATFROM is aarch64
2025-08-12 15:47:01 Info: OS_NAME is kylin
2025-08-12 15:47:01 Info: API_SERVER_HOST is 192.168.1.111
2025-08-12 15:47:01 Info: API_SERVER_PORT is 6443
1.2、方法二:使用!符號(Bash 4.2及以上版本)
#!/bin/bash
export CPU_PLATFROM="aarch64"
export OS_NAME="kylin"
export API_SERVER_HOST="192.168.1.111"
export API_SERVER_PORT="6443"
var_arrs=(CPU_PLATFROM OS_NAME API_SERVER_HOST API_SERVER_PORT)for var in ${var_arrs[@]}
dovar2="${!var}"if [[ -z "${var2}" ]] ; thenecho "${var} is empty!"elseecho "${var} is $var2"fi
done
執行結果,如下所示:
root@k8s-master-58:~# ./check.sh
2025-08-12 15:47:01 Info: CPU_PLATFROM is aarch64
2025-08-12 15:47:01 Info: OS_NAME is kylin
2025-08-12 15:47:01 Info: API_SERVER_HOST is 192.168.1.111
2025-08-12 15:47:01 Info: API_SERVER_PORT is 6443
1.3、方法三:使用declare -n(Bash 4.3及以上版本)
#!/bin/bash
export CPU_PLATFROM="aarch64"
export OS_NAME="kylin"
export API_SERVER_HOST="192.168.1.111"
export API_SERVER_PORT="6443"
var_arrs=(CPU_PLATFROM OS_NAME API_SERVER_HOST API_SERVER_PORT)for var in ${var_arrs[@]}
dodeclare -n var2="$var" if [[ -z "${var2}" ]] ; thenecho "${var} is empty!"elseecho "${var} is $var2"fi
done
執行結果,如下所示:
root@k8s-master-58:~# ./check.sh
2025-08-12 15:47:01 Info: CPU_PLATFROM is aarch64
2025-08-12 15:47:01 Info: OS_NAME is kylin
2025-08-12 15:47:01 Info: API_SERVER_HOST is 192.168.1.111
2025-08-12 15:47:01 Info: API_SERVER_PORT is 6443
總結:整理不易,如果對你有幫助,可否點贊關注一下?
更多詳細內容請參考:Linux運維實戰總結