如何将SwiftDialog输出的键值对提取为Bash独立变量?
解决SwiftDialog输出的键值提取问题
纯Bash循环方案(推荐,易维护)
直接用Bash内置的while read和case语句处理,完美兼容带空格、特殊字符的标签和值:
# 假设fullValue已存储SwiftDialog的输出内容 while IFS=' : ' read -r label_raw value_raw; do # 去除标签前后双引号,还原内部转义的双引号 label=$(sed 's/^"//;s/"$//;s/\\"/"/g' <<< "$label_raw") # 同理处理值的引号与转义 value=$(sed 's/^"//;s/"$//;s/\\"/"/g' <<< "$value_raw") # 根据标签名赋值对应变量 case "$label" in "HMS Asset Tag") hmsAssetTag="$value" ;; "Room #") roomNumber="$value" ;; # 可扩展添加更多标签匹配规则 "Department") department="$value" ;; esac done <<< "$fullValue" # 验证提取结果 echo "HMS Asset Tag: $hmsAssetTag" echo "Room #: $roomNumber"
awk方案(简洁高效)
用awk处理引号和分隔符,生成变量定义语句后导入当前Shell环境:
# 处理输出并生成变量赋值语句,通过source导入当前环境 source <(awk -F' : ' '{ # 去除前后引号,还原内部转义的双引号 gsub(/^"|"$/, "", $1) gsub(/^"|"$/, "", $2) gsub(/\\"/, "\"", $1) gsub(/\\"/, "\"", $2) # 根据标签输出对应变量的赋值语句 if ($1 == "HMS Asset Tag") print "hmsAssetTag=\""$2"\"" else if ($1 == "Room #") print "roomNumber=\""$2"\"" }' <<< "$fullValue") # 验证提取结果 echo "HMS Asset Tag: $hmsAssetTag" echo "Room #: $roomNumber"
关键注意事项
- 必须用
' : '(空格+冒号+空格)作为分隔符,避免误分割标签内的字符 - 处理转义双引号:若用户输入的值包含双引号,SwiftDialog会输出
\",需通过gsub或sed还原为普通双引号 - 标签匹配要严格对应原字符串,包括空格、特殊字符(比如
Room #里的#),直接用字符串匹配即可,无需额外转义
内容的提问来源于stack exchange,提问作者BenPhilware
相关产品推荐
相关产品推荐

