我是 shell 脚本新手,在使用“test”命令和特殊字符 * 比较两个字符串时遇到了一些麻烦。
我必须编写一个shell脚本,对于作为第一个参数传递的目录中包含的每个元素(文件和目录),必须编写一些东西(为了解决我的问题,知道什么是不相关的)写下来)在文件“summary.out”上。此外,还有一个字符串作为第二个参数传递。必须忽略以此字符串开头的那些文件/目录(不必在summary.out 上写入任何内容)。
这是代码:
#!/bin/bash
TEMP=NULL
cd "$1"
for i in *
do
if test "$i" != "$2"*;then #Here is where the error comes from
if test -f "$i";then
TEMP="$i - `head -c 10 "$i"`"
elif test -d "$i";then
TEMP="$i - `ls -1 "$i" | wc -l`"
fi
echo $TEMP >> summary.out
fi
done
该错误来自测试,该测试检查当前文件/目录是否以作为第二个参数传递的字符串开头,并且每次迭代 for 循环时都会发生该错误。它指出:“测试:参数太多”
现在,我进行了一些测试,结果表明该问题与 $i 或 $1 内的空格无关。该问题与我在测试中使用特殊字符 * 相关(如果删除它,一切正常)。
为什么“测试”不能处理 * ?我可以做什么来解决这个问题?
最佳答案
*
由 shell 扩展。
在 bash 中,您可以使用 [[ ... ]]
作为条件,而不是 test
。它们支持右侧的模式 - *
未展开,因为双方括号是具有更高优先级的关键字。
if [[ a == * ]] ; then
echo Matches
else
echo Doesn\'t match
fi
关于string - 在 bash 上使用 test 命令比较两个字符串时,由于特殊字符 * 导致出现 "test: too many arguments"消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30053413/