string - 在 bash 上使用 test 命令比较两个字符串时,由于特殊字符 * 导致出现 "test: too many arguments"消息

标签 string bash shell command

我是 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/

相关文章:

javascript - 添加 HH :MM:SS strings in Javascript

java - 如何将二维字符串数组转换为一维字符串数组?

linux - 从 bash 中的列转换日期

git - 用于 git 提交的 Shell 脚本助手

bash - 需要使用 sed 在文本的第二个下划线和第一个连字符之间进行解析

python - 在无限循环中并行运行多个脚本

regex - Shell:如何用保存的变量值替换文本的某些内容

c - 当字符指针指向字符串时,如何分配内存?

java - 如何反转字符串中特定字母字符的大写(不区分大小写),而不影响字符串中的所有其他字符?

python - 我应该删除脚本创建的临时文件吗?