如何在Bash中读取/tmp/input.dat文件中的多个指定变量?
在Bash中从/tmp/input.dat提取指定变量的方法
嘿,我来帮你搞定在Bash环境下从/tmp/input.dat里提取这三个指定变量的事儿~下面分两种常见场景给你实用方案:
场景1:/tmp/input.dat里是直接的变量赋值行
如果你的/tmp/input.dat内容本身就是每行一个变量赋值(比如下面这种格式):
machine=1234-567*890ABC action=REPLACE location=test_location
那最简单的方式就是直接把文件加载到当前Shell环境里:
# 使用点命令加载文件(和source命令效果完全一致) . /tmp/input.dat # 验证变量是否正确读取 echo "machine: $machine" echo "action: $action" echo "location: $location"
⚠️ 注意:因为machine的值里包含*这个通配符,如果你直接加载未加引号的赋值行,Bash会自动把*展开成当前目录下的文件列表,导致变量值出错。解决办法有两个:
- 提前修改/tmp/input.dat,给
machine的值加上单引号:machine='1234-567*890ABC' - 用sed临时处理文件后再加载:
# 给machine的值加上单引号,生成临时文件 sed -E "s/(machine=)(.*)/\1'\2'/" /tmp/input.dat > /tmp/temp_input.dat # 加载临时文件 . /tmp/temp_input.dat # 删除临时文件 rm /tmp/temp_input.dat
场景2:需要从任意文本中匹配提取变量
如果/tmp/input.dat是普通文本,变量分散在不同行里(比如下面这种情况):
系统信息:machine=1234-567*890ABC,设备状态正常 执行操作:action=REPLACE 目标路径:location=test_location
可以用grep配合Perl正则表达式精准提取每个变量:
# 提取machine变量,\K表示忽略前面的"machine="部分 machine=$(grep -oP 'machine=\K.*' /tmp/input.dat) # 提取action变量 action=$(grep -oP 'action=\K.*' /tmp/input.dat) # 提取location变量 location=$(grep -oP 'location=\K.*' /tmp/input.dat) # 验证提取结果 echo "machine: $machine" echo "action: $action" echo "location: $location"
这个方法的好处是不管变量在文本的什么位置,只要能匹配到变量名=值的格式,就能精准提取值的部分,哪怕值里包含特殊字符也没问题。
内容的提问来源于stack exchange,提问作者Tas
相关产品推荐
相关产品推荐

