Bash循环中利用参数展开提取键值对:解析指定Bash循环的功能
先给你说个整体结论:这段代码的核心是批量检查环境变量,把当前未设置的环境变量写入到指定文件中,方便后续加载这些变量到系统环境里。下面一步步拆解每部分的作用:
循环遍历数组元素
for env in "${envvars[@]}"; do
这一行启动一个循环,遍历名为envvars的数组里的每一个元素。数组里的每个元素都是变量名=变量值格式的字符串,比如HOME=/home/user或者PYTHONPATH=/opt/lib这类。提取环境变量名
var_key="${env%%=*}"
这里用到了Bash的参数展开技巧:%%=*的意思是从字符串末尾开始,删除最长的匹配=*的部分。简单说就是把=以及后面的所有内容都砍掉,只留下=前面的变量名。比如如果env是PATH=/usr/local/bin:/usr/bin,那var_key就会被赋值为PATH。提取环境变量值
var_value="${env#*=}"
这也是参数展开:#*=是从字符串开头开始,删除最短的匹配*=的部分,也就是砍掉=以及前面的所有内容,只留下=后面的变量值。还是用上面的例子,var_value就会被赋值为/usr/local/bin:/usr/bin。检查变量是否已存在
if [[ -z ${!var_key} ]]; then
这里的${!var_key}是Bash的间接引用,意思是“获取名为var_key的变量的当前值”。-z用来判断这个值是否为空——如果为空,说明当前环境里还没设置这个变量,这时候才会执行后面的写入操作。写入环境变量到文件
里面的两行echo命令会把内容追加到${FILE}指定的文件里:- 第一行
echo "export ${env}" >> "${FILE}":直接把原数组元素加上export写入,比如export PATH=/usr/local/bin:/usr/bin。 - 第二行
echo "export ${var_key}=\"${var_value}\"" >> "${FILE}":把变量名和值分开,给值加上双引号再写入,比如export PATH="/usr/local/bin:/usr/bin"——这一步主要是为了兼容变量值里包含空格的情况,避免后续加载时出错。
- 第一行
最后再总结下:这段代码会帮你批量处理一组预设的环境变量,只把那些当前系统没设置的变量,以两种兼容的格式写入到目标文件中,以后只要加载这个文件(比如用source命令),就能把这些变量导入到你的环境里了。
内容的提问来源于stack exchange,提问作者X T

