Bash脚本传递带空格的双引号参数时拆分异常问题
解决Bash脚本传递带空格参数给Java程序的拆分问题
你的问题出在用普通字符串存储命令并直接执行的方式上,Bash在解析这类字符串时会忽略其中的引号,把空格当作参数分隔符,导致"a b"被拆成两个独立参数。
错误原因分析
你原来的脚本里:
x=""a b" "c"" CMD="java -jar test.jar "$x"" $CMD
- 变量
x的定义实际等价于x="a b c",引号会被Bash自动合并,并没有保留参数边界; - 执行
$CMD时,Bash会把整个字符串按空白字符拆分,不管原有的引号,最终参数被拆成a、b、c三个。
正确解决方案
推荐使用数组来存储命令和参数,数组能准确保留每个参数的边界,避免被错误拆分:
方案1:用数组存储目标参数
#!/bin/bash # 每个元素对应一个完整的参数,带空格的参数作为单个元素 args=("a b" "c") # 展开数组时用双引号包裹,确保每个元素作为独立参数传递 java -jar test.jar "${args[@]}"
方案2:用数组存储整个命令
如果需要把Java命令本身也存起来,同样可以用数组:
#!/bin/bash # 数组每个元素对应命令的一部分,参数边界完整保留 cmd=(java -jar test.jar "a b" "c") # 执行数组中的命令 "${cmd[@]}"
方案3:直接执行(最简单的方式)
如果不需要用变量存储,直接写命令即可:
#!/bin/bash java -jar test.jar "a b" "c"
以上三种方式都能保证"a b"作为第一个参数、"c"作为第二个参数传递给Java程序,得到你期望的输出。
内容的提问来源于stack exchange,提问作者user15679756
相关产品推荐
相关产品推荐

