Bash脚本中如何多行书写逗号分隔的参数列表且不影响程序执行?
Bash脚本中如何多行书写逗号分隔的参数列表且不影响程序执行?
这问题我之前也碰到过!你现在的问题出在续行时加了太多前置空格,这些空格会被Bash保留并传递给file-selector程序,而它期望的是纯逗号分隔的路径字符串,混了空格自然就报错了。给你几个靠谱的解决方法:
方法一:用Bash数组(最推荐,清晰又可靠)
把每个路径单独作为数组元素,最后用逗号拼接成参数,完全不用担心空格问题:
#!/bin/bash ... # 把每个路径单独写一行,一目了然 exclude_paths=( "a/b/c/d/e/f1" "a/b/c/d/e/f2" "a/b/c/d/e/f3" "a/b/c/d/e/f4" "a/b/c/d/e/f5" "a/b/c/d/e/f6" ) # 临时设置IFS为逗号,用数组元素拼接成逗号分隔的字符串 IFS=, ./file-selector -exclude="${exclude_paths[*]}" ...
原理:${exclude_paths[*]}会用环境变量IFS的第一个字符来连接数组元素,我们临时把IFS设为逗号,就能得到完全符合要求的参数。
方法二:精简续行写法(适合简单场景)
如果不想用数组,也可以去掉续行后的前置空格,让每一行的路径紧跟上一行的逗号:
#!/bin/bash ... ./file-selector -exclude="a/b/c/d/e/f1,\ a/b/c/d/e/f2,\ a/b/c/d/e/f3,\ a/b/c/d/e/f4,\ a/b/c/d/e/f5,\ a/b/c/d/e/f6" ...
注意:行尾的反斜杠后面不能有任何空格,下一行的路径也不能有前置空格,否则空格会被传递给程序。这种方式虽然简单,但容易不小心出错。
方法三:用printf拼接(灵活但稍繁琐)
通过printf把每个路径加上逗号打印出来,再去掉最后多余的逗号:
#!/bin/bash ... # 用printf批量拼接路径,每个后面加逗号 exclude_list=$(printf "%s," \ "a/b/c/d/e/f1" \ "a/b/c/d/e/f2" \ "a/b/c/d/e/f3" \ "a/b/c/d/e/f4" \ "a/b/c/d/e/f5" \ "a/b/c/d/e/f6") # 去掉字符串最后一个多余的逗号 exclude_list=${exclude_list%,} ./file-selector -exclude="$exclude_list" ...
这种方式适合需要额外处理路径的场景,但要注意最后逗号的处理。
备注:内容来源于stack exchange,提问作者Subzero123
相关产品推荐
相关产品推荐

