以下内容均为个人心得,如有错误,欢迎批评指正。

1:通配符的双引号

tang* 是一个通配符(glob)模式,它会匹配当前目录下所有以 tang 开头的文件和目录。在不加双引号的情况下, tang* 会由 shell 进行扩展(即所谓的 globbing ),自动匹配所有符合模式的文件或目录名。

例如,假设当前目录下有 tang tang tang 文件, tang* 会自动被扩展成 tang1 tang2 tang3 (如果它们存在)。如果加上双引号,变成 " tang* " ,它就不再是一个模式,而是一个字面上的字符串,指向名为 tang* 的文件(而不是匹配以 tang 开头的文件)。这样就失去了扩展的意义。下面是一个例子:

#!bin/bash # 是shell 脚本必须的,shell 会根据这个来执行脚本
for item in *;do  # 遍历当前目录下所有的文件
    if [[ -f $item && $item == tang* ]]; then  # 找到tang开头的文件
        sudo cp $tiem ./backup.d/  # 复制文件到当前文件夹下
        echo "拷贝文件 $item 到backup.d目录下"
    fi
done

总结: 通配符 tang * 应该不加双引号,否则会把它当作字面字符串,而非通配符模式。

2:变量的双引号

$item 是一个变量,它代表脚本中的一个值。在 Bash 中, $item 可以用来引用变量的内容,通常是文件名、目录名或字符串等。双引号与否的使用,决定了如何处理变量中的空格、特殊字符和通配符。

2.1 无双引号

如果不加双引号, Bash 会根据上下文将变量中的内容进行分割。例如,如果 $item 的值是 " file one " ,没有双引号时,它会被拆分成两个独立的部分 " file " " one " 。这可能导致意料之外的结果。

2.2 有双引号

使用双引号时, Bash 会将整个内容作为一个单一的参数传递,即使内容中有空格或特殊字符也不会被拆分。这通常是更安全的做法,尤其在处理文件名或目录名时,防止空格或其他字符导致问题。在某些情况下,比如用于文件名、路径名时,使用双引号可以确保正确处理空格和特殊字符,避免它们被错误地分割或解释。在文件操作中,尤其是涉及到文件名和路径名时,通常建议 加双引号 ,这样可以确保即使文件名中有空格或特殊字符(例如括号、星号等),也能正确处理。

总结:

  • tang* 不能加双引号,因为它是一个通配符,添加双引号会让它变成字面字符串而非通配符模式。
  • $item 可以加也可以不加双引号,但为了避免文件名中包含空格或特殊字符导致的问题,通常建议 加双引号 来保证脚本的健壮性和正确性。

2.3 原理

如何简单理解"$item"可以表示一个文件

Bash 中,变量是可以存储任何类型的数据(字符串、数字、文件路径等)。当你用 "$ item " 引用一个变量时,它实际存储的内容可以是文件的路径或名称。通过这种方式,你可以将 "$ item " 用作文件或目录的标识符,进行各种文件操作(如移动、拷贝、删除等)。

为什么 "$item" 可以作为文件路径进行操作?

变量存储文件路径: 变量 $item 存储的是一个文件的路径或文件名,Bash 会将其作为文件操作的目标或源来处理。例如,在 mv "$item" /path/to/destination/ 中, "$item" 就是文件路径, mv 命令会根据该路径找到文件并执行移动操作。

文件路径是字符串: 事实上,文件路径本身就是一个字符串。在 Bash 中,文件操作(如 mv cp rm 等)接受文件路径作为字符串参数。当你将一个文件路径存储在变量中,并通过 "${variable}" 引用该变量时,它就是字符串的形式,而这些命令会根据该字符串来执行文件操作。