用于从 Nginx 缓存中删除项目的 Bash 脚本

用于从 Nginx 缓存中删除项目的 Bash 脚本

我在 Ubuntu 中运行 Nginx。我正在尝试编写一个脚本来从 Nginx 缓存中删除一个项目。

脚本:clear_single_cache_object.sh

#!/bin/bash
echo "Deleting: " $1
grep -lr $1 /path/to/cache/* | xargs rm
echo "Done"

该脚本位于我的主目录中,我在终端中执行该脚本如下:

sh clear_single_cache_object.sh '/images/test.jpg'

输出如下:

Deleting: /images/test.jpg
: No such file or directory
Done

换句话说,脚本不起作用,并且该项目尚未从缓存中删除。我也尝试以 root 身份运行该脚本。

如果我在终端中输入以下命令,那么它可以正常工作并且该项目将从缓存中删除。

grep -lr '/images/test.jpg' /path/to/cache/* | xargs rm

为什么我运行脚本没有效果呢?我怀疑和脚本中的“|xargs rm”部分有关。

答案1

第一的,格伦·杰克曼接近:您的脚本使用了 CR-LF ( \r\n) 行尾。例如,我手动使用 CRLF 行尾重新创建了您的脚本:

$ cat foo.sh     
#!/bin/bash
echo "Deleting: " $1
grep -lr $1 foo.txt | xargs echo
echo "Done"
$ file foo.sh 
foo.sh: Bourne-Again shell script, ASCII text executable, with CRLF line terminators
$ sh foo.sh bar
Deleting:  bar
: No such file or directory
Done

dos2unix通过安装并使用它来转换,将行尾更改为正常形式:

sudo apt-get install dos2unix
dos2unix clear_single_cache_object.sh

其次,既然你给出了一个shebang,为什么还要用 调用你的脚本sh?使其可执行并直接运行它:

chmod +x clear_single_cache_object.sh
./clear_single_cache_object.sh /images/test.jpg

如果你这样做了,你就能更早地发现问题:

$ ./foo.sh 
bash: ./foo.sh: bad interpreter: /bin/bash^M: no such file or directory

第三,修复编辑器。如果您在 Windows 上创建脚本,然后将其复制到服务器,请使用支持 Unix 行尾 (LF) 的像 Notepad++ 这样的编辑器。

相关内容