bash - 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
解决方案
首先,如果你希望你的参数被解析为逗号分隔,为什么你的 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
之间的空间分隔列表...second
path
因此,重新定义 IFS 以仅包含逗号,对于read
和for
:
#!/bin/bash
IFS=','
read -r -a array <<< "${@}"
for t in ${array[@]}
do
envsubst < $t > "${t}_new"
done
你去吧。
推荐阅读
- reactjs - React native + firebase 将当前 uid 上传到 firebase
- java - TlsPremasterSecret SecretKeyFactory 不可用
- asp.net-web-api - PUT 适用于 POSTMAN,但不适用于 AXIOS
- java - 创建一个值作为泛型类型的映射,并且能够在从映射中检索后对值进行操作
- spring-security - 弹簧靴安全性的 CORS 问题
- google-app-maker - 在 Appmaker 中将默认日期存储为今天的日期列
- javascript - 从选定的行中获取第三个属性
- c# - 重构C#实体框架6项目为moqqing使用依赖注入
- regex - 正则表达式元描述
- visual-studio-code - Visual Studio Code 在现有项目上转换缩进