如何在Bash脚本中从env.txt提取UID与PWD并赋值变量?
提取env.txt中的UID和PWD字段
首先说下你提到的按行号提取的方法,假设你的env.txt里每个参数单独占一行(比如UID在倒数第二行,PWD在倒数第一行),可以用tail和sed组合实现,但这个方法非常依赖文件的格式稳定性,一旦参数顺序调整、新增/删除参数就会失效,先给你参考:
按行号提取的实现
# 提取倒数第二行的UID,去掉前缀"UID="和末尾的分号 UID=$(tail -n 2 env.txt | head -n 1 | sed -e 's/^UID=//' -e 's/;$//') # 提取倒数第一行的PWD,去掉前缀"PWD="和末尾的分号 PWD=$(tail -n 1 env.txt | sed -e 's/^PWD=//' -e 's/;$//')
不过真心不推荐这种方式,下面是更优的方案:通过匹配字段名提取,不管参数在文件里的位置(不管是一行还是多行存储),都能准确获取值,稳定性强很多。
更优方案:匹配字段名提取
方法1:用grep+sed(简单直观)
# 提取UID:匹配"UID="开头到下一个分号前的内容,再去掉前缀 UID=$(grep -o 'UID=[^;]*' env.txt | sed 's/UID=//') # 提取PWD:同理匹配"PWD="开头到下一个分号前的内容 PWD=$(grep -o 'PWD=[^;]*' env.txt | sed 's/PWD=//')
解释:grep -o只输出匹配的部分,[^;]*表示匹配分号以外的所有字符(也就是字段的值),再用sed去掉字段名前缀。
方法2:纯Bash内置处理(无需外部工具,效率更高)
如果你的env.txt里所有参数在同一行,直接用Bash的字符串截取功能:
# 先把文件内容读入变量 ENV_CONTENTS=$(cat env.txt) # 提取UID:先去掉"UID="之前的所有内容,再去掉第一个分号及之后的内容 UID=${ENV_CONTENTS#*UID=} UID=${UID%%;*} # 提取PWD:同理处理 PWD=${ENV_CONTENTS#*PWD=} PWD=${PWD%%;*}
解释:
${变量#*匹配字符串}:删除变量开头到第一个匹配字符串的所有内容${变量%%匹配字符串*}:删除变量中最后一个匹配字符串及之后的所有内容(这里因为值里没有分号,用%(最短匹配)效果一样)
方法3:用awk(适合复杂格式场景)
如果文件里参数分布在多行或者格式多变,awk的处理更灵活:
# 提取UID UID=$(awk -F'; *' '{for(i=1;i<=NF;i++){split($i, kv, "="); if(kv[1]=="UID") print kv[2]}}' env.txt) # 提取PWD PWD=$(awk -F'; *' '{for(i=1;i<=NF;i++){split($i, kv, "="); if(kv[1]=="PWD") print kv[2]}}' env.txt)
解释:-F'; *'把分隔符设为分号加任意空格,遍历每个字段后用split拆成键值对,匹配到目标键就输出对应的值。
总结
优先选择匹配字段名的方法,尤其是纯Bash处理或者grep+sed的方式,它们不依赖行号,能适应文件格式的小变化,鲁棒性更强。
内容的提问来源于stack exchange,提问作者user123328
相关产品推荐
相关产品推荐

