Shell脚本从文件读取参数时含空格参数被拆分如何解决?
问题根源
你使用bash scripts.sh $(cat inputs.txt)执行脚本时,shell会先执行命令替换,将cat inputs.txt的输出按默认内部字段分隔符(IFS,包含空格、制表符、换行符)拆分为独立的参数传入脚本,因此包含空格的时间参数会被拆分为两个独立参数,导致$3仅能取到日期部分,时间部分被识别为$4,不符合预期。
可用解决方案
方案1:修改脚本内部参数处理逻辑(改法最简单,无需调整调用方式或输入文件)
在script.sh开头新增参数拼接逻辑,将第3位及之后的所有参数自动拼接为完整的时间值,同时修正原脚本中curl请求的JSON语法错误(原data参数多了一个冗余的],会导致请求报错):
#script.sh clear echo ---------------------------------------------- echo ***********"starting shell script"************ echo ---------------------------------------------- ls # 新增参数处理逻辑 batch_id="$1" modality="$2" start_time="${*:3}" # 将第3位开始的所有参数拼接为单个字符串 curl --location --request POST "http://localhost:8081/adddetails" --header "Content-Type: application/json" --data "{ \"batch_id\": \"$batch_id\", \"modality\": { \"modality\" : \"$modality\" }, \"start_time\": \"$start_time\"} } " echo "$batch_id" echo "$modality" echo "$start_time" echo ---------------------------------------------- echo ***********"ending shell script"************ echo ----------------------------------------------
修改完成后直接用原有命令执行即可。
方案2:调整调用命令,手动包裹带空格参数
如果不想修改脚本,可以在调用时手动提取参数,将带空格的时间参数用引号包裹避免拆分:
bash script.sh $(cut -d' ' -f1 inputs.txt) $(cut -d' ' -f2 inputs.txt) "$(cut -d' ' -f3- inputs.txt)"
方案3:修改输入文件格式,适配xargs调用(通用性更强,适合多组带空格参数的场景)
首先修改inputs.txt,将带空格的参数用双引号包裹:
1 a "2015-12-31 18:30:00"
之后用xargs调用脚本,xargs会自动识别引号包裹的内容为单个参数:
xargs -a inputs.txt bash script.sh
内容的提问来源于stack exchange,提问作者Pratiksha Dalal
相关产品推荐
相关产品推荐

