Linux Bash脚本调用tshark含空格参数的等价实现问题
解决Bash脚本中TShark参数传递问题
现有问题
现有decode_bip_MCShark.sh脚本内容:
cd $1 echo tshark -r $2 -Y $3 $4 -T fields tshark -r $2 -Y $3 $4 -T fields
执行命令:
sh decode_bip_MCShark.sh /home/ute/ A.pcap '"3gpp.subcellid == 0 && Length != 0x00000000"' '-e UlData_detectedPrachPreambles_t.prachPreambleIndex -e UlData_detectedPrachPreambles_t.initialTa'
执行后报错:
tshark -r A.pcap -Y "3gpp.subcellid == 0 && Length != 0x00000000" -e UlData_detectedPrachPreambles_t.prachPreambleIndex -e UlData_detectedPrachPreambles_t.initialTa -T fields tshark: Display filters were specified both with "-Y" and with additional command-line arguments.
但直接运行对应TShark命令无报错:
tshark -r A.pcap -Y "3gpp.subcellid == 0 && Length != 0x00000000" -e UlData_detectedPrachPreambles_t.prachPreambleIndex -e UlData_detectedPrachPreambles_t.initialTa -T fields
Windows下使用%~4处理参数的批处理可正常工作:
cd %1 tshark -r %2 -Y %3 %~4 -T fields
解决方案
Linux Bash中,原脚本的$4会把包含多个选项的字符串作为单一参数传递,导致TShark误判参数。要实现Windows%~4的等价效果,需将第4个及之后的参数拆分为独立选项传递,修改后的脚本如下:
写法一:使用shift处理剩余参数
cd "$1" # 移除第一个参数(目录),后续参数顺位前移 shift # 此时$1是pcap文件,$2是过滤器,${@:3}是从第3个开始的所有参数(即原$4拆分后的多个-e选项) tshark -r "$1" -Y "$2" "${@:3}" -T fields
写法二:明确拆分参数
cd "$1" pcap_file="$2" filter="$3" # 移除前3个参数,剩余$@即为原第4个参数拆分后的所有选项 shift 3 tshark -r "$pcap_file" -Y "$filter" "$@" -T fields
说明
- 用双引号包裹所有变量,避免空格或特殊字符导致参数拆分错误
shift命令用于移除前N个参数,剩余的$@会自动将原第4个参数中的多个选项拆分为独立的命令行参数,与Windows%~4的效果一致
内容的提问来源于stack exchange,提问作者gsmgxm
相关产品推荐
相关产品推荐

