以下内容均为个人心得,如有错误,欢迎批评指正。
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}"
引用该变量时,它就是字符串的形式,而这些命令会根据该字符串来执行文件操作。


发布评论