求助:拖拽填充路径的bash脚本中awk解析XML失败问题
Bash脚本查询XML信息失败的解决思路
你想要写一个易用的Bash脚本,提示用户输入(可拖拽)XML文件路径,用Awk提取其中的SURFACE_AREA值,但脚本无法正常运行。原脚本如下:
#!/bin/sh echo "Enter Your path with the .xml file : " #Drag and drop the file path here read ROUTE if [[ -f "$ROUTE" ]]; then AREA=$(awk -F "[><]" '/SURFACE_AREA/{print $3}' $ROUTE) echo "Total area: $AREA sq. km." else echo "You did not select the correct format." fi /bin/rm -f $AREA /bin/rm -f $ROUTE
问题分析与解决办法
- 脚本解释器不匹配:原脚本用
#!/bin/sh,但使用了Bash独有的[[ ]]条件判断语法,部分系统的sh是POSIX shell,不支持该语法。把开头改成#!/bin/bash。 - Awk分隔符错误:代码里的
[><]是HTML转义字符,Awk无法识别成<和>,应该直接写[<>];同时要给$ROUTE加双引号,避免路径带空格时出错。正确的Awk命令是:awk -F "[<>]" '/SURFACE_AREA/{print $3}' "$ROUTE"。 - 致命的rm命令:最后两行
rm $AREA和rm $ROUTE完全错误——$AREA是提取的面积数值,不是文件;$ROUTE是用户的XML文件,执行会直接删除用户的文件,必须删掉这两行。 - read命令优化:处理拖拽路径(可能带空格或特殊字符)时,用
read -r ROUTE可以避免反斜杠被转义。 - 文件格式检查完善:原判断只检查是否是文件,没验证
.xml后缀,可以改成if [[ -f "$ROUTE" && "$ROUTE" == *.xml ]]; then,确保用户输入的是XML文件。
修正后的脚本
#!/bin/bash echo "Enter Your path with the .xml file : " #Drag and drop the file path here read -r ROUTE if [[ -f "$ROUTE" && "$ROUTE" == *.xml ]]; then AREA=$(awk -F "[<>]" '/SURFACE_AREA/{print $3}' "$ROUTE") echo "Total area: $AREA sq. km." else echo "You did not select a valid XML file." fi
内容的提问来源于stack exchange,提问作者Diego Alarcón
相关产品推荐
相关产品推荐

