如何转义 unix shell 脚本中隐藏在变量内的特殊字符

如何转义 unix shell 脚本中隐藏在变量内的特殊字符

我正在使用 bash shell 脚本使用以下脚本删除目录中的某些文件

#!/bin/bash
path=$1
for filename in $path/*; do
    if [ -d "$filename" ]; then
        echo $filename
        rm $filename/*statssys*
    fi
done

换句话说,它正在循环遍历指定路径内一层深处的所有目录,并删除statssys该名称中包含的所有文件。问题是检索到的文件路径$filename包含数字结尾,例如file_path[8]file_path[9]。在命令运行之前必须转义方括号rm,我不知道该怎么做,因为它们隐藏在 $filename 变量中。

任何帮助表示赞赏。

答案1

在 Bash 脚本中,临时程序员可能会陷入许多陷阱。

一条规则是对每个参数扩展加双引号,这是您的主要问题。其他一些规则包括避免echo输出任意数据用于--将选项与其他参数分开防止出现开头-但不应该被视为选项的争论。

在您的示例中,您可以将脚本更改为:

#!/bin/bash --
path="$1"
for filename in "$path"/*; do
    if [ -d "$filename" ]; then
        printf '%s\n' "$filename"
        rm -- "$filename"/*statssys*
    fi
done

如需更详细的解释,我强烈建议您阅读重击陷阱

相关内容