在bash脚本转义空间(Escaping space in bash script)

2019-09-16 20:22发布

我试图让一个脚本追加与.hash结尾的所有文件由md5deep进行验证。 在他们的名字空间的文件似乎打破了这个剧本。

#!/bin/bash
XVAR=""
for f in *.hash
do
    XVAR="$XVAR -x $f "
done
md5deep -e $XVAR -r *

每当我运行了一个名为“澳S.hash”文件中的脚本我会得到

O: No such file or directory

如果我改变XVAR="$XVAR -x $f "XVAR="$XVAR -x \'$f\' "XVAR="$XVAR -x \"$f\" "

md5deep会互相渗透的输入为“○代替

"O: No such file or directory

在脚本变量的回声表示XVAR作为-x 'O S.hash'-x "O S.hash"

该命令的外壳,如手动输入md5deep -e -x "O S.hash" -r *的作品,但如果它在脚本的命令似乎打破

Answer 1:

这是不是最好的解决办法,但似乎它的工作:

find . -name '*.hash' -printf "-x\0%p\0" | xargs -0 md5deep -r * -e

这实际上没有做的OP想要完全一样的,所以这里的为添POTE和乔纳森·莱弗勒提出了修改:

find . -maxdepth 1 -name '*.hash' -printf "-x\0%p\0" | xargs -0 md5deep -r * -e


Answer 2:

现在你知道为什么人们在Unix系统传统上避免带空格(和目录名同样)文件名 - 这是一个滋扰(礼貌吧)不得不外壳来处理这样的程序名。 外壳是专为在系统中没有这样的名字。 换行也造成多大的悲痛。

随着bash ,到目前为止你最好的解决办法是使用一个数组来保存的元素,然后"${array[@]}"列出它们; 这几乎是微不足道的:

declare -a XVAR

for file in *.hash
do
    XVAR+=("-x" "$file")
done

md5deep -e "${XVAR[@]}" -r *

利用由所提到的阵列扩展符号戈登戴维森见§6.7所述的“阵列”。 bash参考手册(击4.1)进行了大量的阵列信息;参见§3.4“壳牌参数”为+= 。操作者)

如果你不能使用数组出于某种原因,那么你需要逃脱它的参数,使外壳不会扭曲事情的程序。 我有这样一个程序,称为escape

XVAR=
for file in *.hash
do
    name=$(escape "$file")
    XVAR="$XVAR -x $file"
done
eval md5deep -e $XVAR -r *

随着EVAL,它是棘手的使用; 它的工作原理,但使用数组。



文章来源: Escaping space in bash script
标签: linux bash