首页 > 解决方案 > bash 脚本的命令行参数中的转义空格字符

问题描述

我有一个 bash 脚本,它采用逗号分隔的文件路径列表,将它们解析为数组,然后[envsubst][1]对每个文件执行环境变量替换函数 ()。但是,其中一个路径包含一个空格,到目前为止,它不是重命名文件夹的选项。有没有办法转义文件中的空间并将其作为参数传递到我的脚本中,以便second最终path不会被解释为两个单独的变量?我已经尝试了一些我在 SO/在线帖子中看到的尝试,包括:

第二个\路径/file.txt

第二个%qpath/file.txt

'第二个路径/file.txt'

“第二个路径/file.txt”

这些中的每一个都以拆分单词“second”和“path/file.txt”的函数结束。

命令行界面

$sh envsub.sh first/path.txt,second path/file.txt

sh脚本

#!/bin/bash
IFS=', ' read -r -a array <<< "${@}"

for t in ${array[@]}; do 
    envsubst < $t > "${t}_new"
done

标签: bashmacosterminal

解决方案


首先,如果你希望你的参数被解析为逗号分隔,为什么你的 IFS 中有一个空格(你不想分隔任何东西)

改变:

IFS=', ' read -r -a array <<< "${@}"

至:

IFS=',' read -r -a array <<< "${@}"

瞧,空格不再是分隔参数,您可以根据需要${array[1]}进行包含second path/file.txt

然后是第二个陷阱:

for t in ${array[@]};

${array[@]}扩展到 的所有成员array,它们是两个(由 中的第一个字符分隔IFS),其中一个包含空格。

并且由于您的IFS重新定义仅适用于您的read行,for因此现在将使用默认值,该默认值再次包含空格作为分隔符。并将在和for之间的空间分隔列表...secondpath

因此,重新定义 IFS 以包含逗号,对于readfor

#!/bin/bash
IFS=','
read -r -a array <<< "${@}"

for t in ${array[@]}
do 
    envsubst < $t > "${t}_new"
done

你去吧。


推荐阅读