我试图让一个脚本追加与.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 *
的作品,但如果它在脚本的命令似乎打破
这是不是最好的解决办法,但似乎它的工作:
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
现在你知道为什么人们在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,它是棘手的使用; 它的工作原理,但使用数组。