使用命令行参数查找带有符号的文件时出现意外结果

使用命令行参数查找带有符号的文件时出现意外结果

我正在尝试编写一个接受 2 个命令行参数的脚本,例如一个是目录名称,另一个是符号(任何符号可以是 $、£、^、* 等)。然后,它应该检查目录中是否有包含该符号的文件名,以及是否未将该符号添加到目录中。

因此,如果我查找名为testDir第一个参数的目录并使用 a*作为第二个参数,它将检查该目录中的文件以查看文件中是否存在该符号,如果不存在,则该目录现在将被称为testDir*

这是我正在尝试开发的一些代码。

a1=$1  
  symbol=$(ls $a1 | grep $2)

   if [ "$symbol" != "" ]
     then
     echo "file has Symbol"

   else
     echo "The symbol was added to directory"
     mv $a1 $1$2
    fi

它似乎与@符号一起工作正常,所以我相信它受到特殊字符的影响。有什么方法可以尝试转义特殊字符,但也可以使用非特殊字符?

答案1

首先,它是从来都不是一个好主意ls解析查找文件名时的输出。这将破坏任何奇怪的字符,包括简单的空格。最好的方法是使用shell 通配符或者find相反。

您的下一个问题是您没有引用变量,这意味着在mv运行命令之前会扩展特殊字符。您的脚本的一个工作示例是:

#!/usr/bin/env bash

if find "$1" -print0 | grep -z "$2" >/dev/null
then
    echo "file has Symbol" 
else
    echo  "The symbol was added to directory" 
    echo mv "$1" "$1$2" 
fi

警告: 我不知道你为什么要这样做。它会。例如,尝试将目录移动到其自身的子目录中,这将失败。我怀疑这里存在 XY 问题,并建议您编辑问题以解释您真正想要做什么。

相关内容