1、 通配符
通配符是shell在做PathnameExpansion时用到的。说白了一般只用于文件名匹配,它是由shell解析的,比如find,ls,cp,mv等
1、1 Shell常见通配符:
通配符 |
含义 |
实例 |
* |
匹配 0 或多个字符 |
a*b a与b之间可以有任意长度的任意字符, 也可以一个也没有, 如aabcb, axyzb, a012b, ab。 |
? |
匹配任意一个字符 |
a?b a与b之间必须也只能有一个字符, 可以是任意字符, 如aab, abb, acb, a0b。 |
[list] |
匹配 list 中的任意单一字符 |
a[xyz]b a与b之间必须也只能有一个字符, 但只能是 x 或 y 或 z, 如: axb, ayb, azb。 |
[!list]或[^list] |
匹配 除list 中的任意单一字符 |
a[!0-9]b a与b之间必须也只能有一个字符, 但不能是阿拉伯数字, 如axb, aab, a-b。 |
[c1-c2] |
匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z] |
a[0-9]b 0与9之间必须也只能有一个字符 如a0b, a1b... a9b。 |
[!c1-c2]或[^c1-c2] |
匹配不在c1-c2的任意字符 |
a[!0-9]b 如acb adb |
{string1,string2,...} |
匹配 sring1 或 string2 (或更多)其一字符串 |
a{abc,xyz,123}b 列出aabcb,axyzb,a123b |
1、2 shell Meta字符(元字符)
shell 除了有通配符之外,还有一系列自己的其他特殊字符。
字符 |
说明 |
IFS |
由 <space> 或 <tab> 或 <enter> 三者之一组成(我们常用 space ) |
CR |
由 <enter> 产生 |
= |
设定变量 |
$ |
取变量值或取运算值 |
> |
重定向 stdout |
< |
重定向 stdin |
| |
管道符号 |
& |
重导向 file descriptor ,或将命令置于背景执行 |
( ) |
将其内的命令置于 nested subshell 执行,或用于运算或命令替换 |
{ } |
将其内的命令置于 non-named function 中执行,或用在变量替换的界定范围 |
; |
在前一个命令结束时,而忽略其返回值,继续执行下一个命令 |
&& |
在前一个命令结束时,若返回值为 true,继续执行下一个命令 |
|| |
在前一个命令结束时,若返回值为 false,继续执行下一个命令 |
! |
运算意义上的非(not)的意思 |
# |
注释,常用在脚本中 |
\ |
转移字符,去除其后紧跟的元字符或通配符的特殊意义 |
1、3 转义字符
有时候,我们想让 通配符,或者元字符 变成普通字符,不需要使用它。那么这里我们就需要用到转义符了。 shell提供转义符有三种。
字符 |
说明 |
‘’(单引号) |
硬转义,其内部所有的shell 元字符、通配符都会被关掉。 |
“”(双引号) |
软转义,其内部只允许出现特定的shell 元字符:$用于参数替换 `(反单引号,esc键下面)用于命令替换 |
\(反斜杠) |
又叫转义,去除其后紧跟的元字符或通配符的特殊意义 |
举例:
2、正则表达式
正则表达式是用来匹配字符串的,针对文件内容的文本过滤工具里,大都用到正则表达式,如vi,grep,awk,sed等。
另外,这篇文章只针对Linux下的文本过滤工具的正则表达式进行讨论,其他的一些编程语言,如C++(c regex,c++ regex,boost regex),java,python等都有自己的正则表达式库。
简单点来说,正则表达式是对一组正在处理的文本的描述。
3、通配符和正则表达式比较
(1)通配符和正则表达式看起来有点像,不能混淆。可以简单的理解为通配符只有*,?,[],{}这4种,而正则表达式复杂多了。
(2)*在通配符和正则表达式中有其不一样的地方,在通配符中*可以匹配任意的0个或多个字符,而在正则表达式中他是重复之前的一个或者多个字符,不能独立使用的。比如通配符可以用*来匹配任意字符,而正则表达式不行,他只匹配任意长度的前面的字符。
(3)使用场景:通配符 是文件名。正则表达式 文本内容
(4) 使用命令 通配符 find rm ls cp 由shell解析; 正则表达式 vi grep sed awk
基础正则符号: B RE
^
$
. 代表【一定有一个任意字符】的字符
* 意义:重复零个到无穷多个的前一个RE字符
^$
.*
[]
[^]
\ 转义 ,撬棍
贪婪性
扩展正则:
ERE
+
|
()
{} {n,m}
? 0,1个 grep 'a?c' 1.txt
!在正则表达式中并不是特殊字符。
正则表达式:
https://blog.csdn.net/K346K346/article/details/51819236
shell特殊符号大全
0.简介
Shell 是类 Unix 操作系统的命令解析器,用于解释执行用户输入的一连串命令。它类似于 DOS 下的 command.com 和后来 Windows 的 cmd.exe。
同时 Shell 也是一种程序设计语言。作为命令解释型的脚本语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令。作为程序设计语言,它预定义了各种环境变量,保留了一些关键字以及一些特殊字符,并提供了许多在高级语言中才具有的控制结构,如循环和分支判断。
1.分类
Shell 基本分两大类:
(1)图形界面 Shell(GUI Shell, Graphical User Interface Shell)
如应用最为广泛的 Windows Explorer,以及广为人知的 Linux Shell。其中 Linux Shell 包括 X window manager (BlackBox 和 FluxBox),以及功能更强大的 CDE、GNOME、KDE、 XFCE 等。
(2)命令行式 Shell(CLI Shell, Command Line Interface Shell)
常见的命令行式 Shell,按照问世时间排序有最早的 Bourne Shell(sh)、后来由比尔·乔伊在 BSD 系统上开发的 C Shell(csh)、AT&T 公司的贝尔实验室开发的 Korn Shell (ksh)、GNU 的 Bourne Again Shell (bash)、POSIX Shell、macOS 中使用的 zsh 等。最常见的应该是 GNU 的 bash 了。
2.常见特殊字符
Shell 特殊字符纷繁复杂,各种特殊符号在我们编写 Shell 脚本时候如果能够用得好,往往能起到事半功倍的效果。为此,特地将 Shell 里面的一些常见特殊符号归类并罗列成对照表的形式,以便快速的查找。看看你知道或者用过下表中你的哪些 Shell 符号呢?
Shell 特殊字符可以分为以下几类:特殊变量,替换符,转义字符,字符串符(引号),功能符,运算符。
2.1 特殊变量
序号 符号 作用 示例
1 $0 当前脚本的名称
2 $# 传递给脚本或函数的参数个数
3 $* 传递给脚本或函数的所有参数
4 $@ 传递给脚本或函数的所有参数。被双引号""包含时,与 $* 稍有不同,下面将会讲到
5 $? 上个命令的退出状态,或函数的返回值。
6 $$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
7 $n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数,第一个参数是$1,第二个参数是$2。
8 * 作为匹配文件名扩展的一个通配符,能自动匹配给定目录下的每一个文件。
9 ~ 波浪号。和环境变量 $HOME 一样。默认表示当前用户的家目录 echo ~ 查看家目录
10 -- 两个减号,与 ~ 相同,表示当前用户的家目录 cd - - 回到家目录,但不能 echo -- 输出
11 ~+ 当前工作目录。和环境变量 $PWD 一样。 echo ~+可以查看当前目录
12 ~- 前一个工作目录。和内部变量 $OLDPWD 一致,和减号一样。 echo ~-可以查看前一个工作目录
13 - 减号。和~-一样,表示前一个工作目录。 cd - 回到前一个工作目录,但不能 echo - 来查看
14 . 点号。表示当前目录 ls . 查看当前目录内容
15 .. 两个点号。表示上一层目录 ls .. 查看上一层目录内容
关于上面的特殊变量的几个知识点:
(1)$@ 与 $* 的区别?
$@ 和 $* 都表示脚本或者函数传入的参数,不被双引号包含时,都以 $1 $2 … $n 的形式输出所有参数。
但是当它们被双引号包含时,"$*"会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数。但是"$@"和$@一样,还是会将各个参数分开,以$1 $2 … $n的形式输出所有参数。
具体参考如下示例:
function print(){
echo "param num:"$#
for i in "$*"
do
echo param:$i
done
for i in "$@"
do
echo param:$i
done
echo "all param:"$*
echo "all param:"$@
echo param1:$1
echo param2:$2
return 12
}
print "lvlv0" "lvlv1"
echo $?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
运行脚本,输出结果:
param num:2
param:lvlv0 lvlv1
param:lvlv0
param:lvlv1
all param:lvlv0 lvlv1
all param:lvlv0 lvlv1
param1:lvlv0
param2:lvlv1
12
1
2
3
4
5
6
7
8
9
2.2 替换符
替换符分为命令替换符和变量替换符。
2.2.1 变量替换符
序号 符号 作用 示例
1 $ 美元符放在变量前用于取变量的值 echo $PATH 打印环境变量 PATH 的值
2 ${} 美元符加上大括号,大括号中放变量的名称,也是用于读取变量的值 echo ${PATH}path,访问变量PATH,而不是变量 PATHpath,注意和上面 $ 的区别
3 ${:-} 用法${var:-word}。表示如果变量 var 为空或已被删除(unset),那么返回 word,但不改变 var 的值。
4 ${:+} 用法${var:+word}。如果变量 var 被定义,那么返回 word,但不改变 var 的值。
5 ${:=} 用法${var:=word}。如果变量 var 为空或已被删除(unset),那么返回 word,并将 var 的值设置为 word。
6 ${:?} 用法${var:?message}。如果变量 var 为空或已被删除(unset),那么将消息 message 送到标准错误输出,可以用来检测变量 var 是否可以被正常赋值。若此替换出现在Shell脚本中,那么脚本将停止运行。
7 ${#} 用法${#var}。获取字符串变量 var 的长度 string="abcd"; echo ${#string} 输出 4
8 ${:} 字符串提取,用法${var:n}。若n为正数,n从0开始,表示在变量var中提取第n个字符到末尾的所有字符。若n为负数,提取字符串最后面n的绝对值个字符,使用时在冒号后面加空格或一个算术表达式或整个num加上括号,如${var: -2}、${var:1−3}或 ${var:(-2)}均表示提取字符串最后两个字符。 a="abcde";echo ${a:1-4}输出 cde。
9 ${::} 字符串提取,用法${var:n1:n2}。 string="tencent is a great company";echo ${string:1:4}输出 ence。
10 {,} 顺序扩展,用法${value1,value2,value3},逗号分隔一般用于文件列表的扩展。 echo {a,b}.txt输出 a.txt b.txt。
11 {..} 顺序扩展,用法${value1..value2},双点号分隔一般用于文件列表的扩展。 echo {a..d}.txt输出 a.txt b.txt c.txt d.txt
12 ${#} 模式匹配截断,不改变原变量。用法${var#pattern},在 var 中查找给定的模式 pattern,把 var 中的内容去掉左边最短的匹配模式。 var=testcase; echo ${var#*s}输出 tcase。
13 ${##} 模式匹配截断,不改变原变量。用法${var##pattern},在 var 中查找给定的模式 pattern,把 var 中的内容去掉左边最长的匹配模式。 var=testcase; echo ${var##*s} 输出 e。
14 ${%} 模式匹配截断,不改变原变量。用法${var%pattern},在 var 中查找给定的模式 pattern,把 var 中的内容去掉右边最短的匹配模式。 var=testcase;echo ${var%s*e} 输出 testca。
15 ${%%} 模式匹配截断,不改变原变量。用法${var%%pattern},在 var 中查找,把 variable 中的内容去掉右边最长的匹配模式。 var=testcase;echo ${var%%s*e}输出 te。
16 ${/ /} 模式匹配替换,不改变原变量。用法${var/pattern/pattern}将 var 字符串的第一个匹配的 pattern 替换为另一个 pattern。 var=/home/centos;echo ${var/o/h}输出 /hhme/centos
17 ${// /} 模式匹配替换,不改变原变量。用法${var//pattern/pattern}表示将 var 字符串中的所有能匹配的 pattern 替换为另一个pattern。 var=/home/centos;echo ${var//o/h}输出 /hhme/cenths。
18 $[] 整数扩展,在方括号内执行整数表达式并返回结果。 a=3;b=7;echo $[$a+$b]输出 10
注意: 上面的模式不符合正则表达式的规则。
2.2.2 命令替换符
序号 特殊符号 作用 示例
19 $() 美元符加小括号,命令替换符,用于执行命令,替换命令的输出结果 echo $(date)
20 `` 一对反引号,在键盘的 Tab 键上面。注意与单引号的区别,其作用与 $() 相同 echo `date`
2.3 转义字符
下面的转义字符都可以用在 echo 中。
序号 符号 作用 示例
1 \ 反斜杠,用于转义
2 \a 警报,响铃
3 \b 退格(删除键)
4 \f 换页(FF),将当前位置移到下页开头
5 \n 换行
6 \r 回车
7 \t 水平制表符(tab键)
8 \v 垂直制表符
9 \c 不产生进一步的输出。也就是说在 \c 后,这一行后面的内容都不会输出,直接删掉了 echo -e "this is line1 \c these word will disappear",输出 this is line1
可以使用 echo 命令的 -e 选项启动转义,-E 选项禁止转义,默认也是不转义的。禁止转义的话也就无法识别上面除反斜杠外的其它的转义字符了,比如echo "\n" 是不会换行的,而是输出 \n,如果换行的话,使用echo -e "\n"。
2.4 字符串符(引号)
序号 符号 作用 示例
1 ‘’ 两个单引号。单引号括住的内容,被视为常量字符串,引号内禁止变量扩展,并且单引号字符串中不能出现单引号(对单引号使用转义符后也不行) echo '$PATH',输出字符串 $PATH
2 “” 两个双引号。双引号包围的内容允许变量扩展,可以包含双引号,但需要转义。 echo "$PATH",输出环境变量 PATH 的内容
2.5 功能符
功能符号,我在这里把它分为两类。第一类是语法功能符,第二类是命令功能符。具体详见下文。
2.5.1 语法功能符
序号 符号 作用 示例
1 # 井号。注释符号。在shell文件的行首,作为include标记,#!/bin/bash;其他地方作为注释使用。
2 ; 分号。语句的分隔符。在shell文件一行写多条语句时,使用分号分割。
3 ;; 双分号。在使用 case 选项时,作为每个选项的终结符。在 Bash version 4+ 的时候,还可以使用[;;&]或 [;&]
4 / 斜杠。路径的分隔符,路径中仅有一个斜杆表示根目录,以斜杆开头的路径表示从根目录开始的路径。
5 | 管道。管道是类 Unix 系统都有的概念,是非常基础、非常重要的一个概念。它的作用是将管道前(左边)命令产生的输出作为管道后(右边)命令的输入。 less fiel | wc -l 用于统计文件的行数
6 > 输出重定向。 echo lvlv>file,将标准输出重定向文件file中去,如果文件存在则覆盖,不能存在则创建。不指定输出的内容,>file,则清空文件。
7 >> 输出重定向追加符。 echo lvlv 1>>file,将标准输出重定向文件file的最后面,不会覆盖file原有内容
8 >& 输出重定向等同符,作用于文件描述符,即左右两边的操作数是文件描述符 echo lvlv>file 2>&1,标准输出重定向到文件file中,标准错误输出与标准输出重定向一致
9 &> 标准输出和标准错误输出重定向符。 echo lvlv &>file,标准输出和标准错误输出都重定向到文件file中,与echo lvlv 1>file 2>&1 功能相同
10 < 输入重定向 test.sh < file,脚本test.sh需要read的地方会从文件file读取
11 << 名为 here document。用法格式 cmd << text。作用将后继内容重定向到左侧命令的 stdin 中。内容直到与 text 相同的行结束。除非使用引号把输入括起来,此模式将对输入内容进行 Shell 变量替换。如果使用 <<- ,则会忽略接下来输入行首的 tab,结束行也可以是一堆 tab 再加上一个与 text 相同的内容。
12 <& 标准输入重定向等同符,作用于文件描述符,即左右两边的操作数是文件描述符 cmd <& m,将文件描述符m作为cmd的输入,省略了标准输入描述符1,即等价于cmd 1<&fd
13 >&- 关闭某个输出文件描述符。用法格式:exec fd>&- exec >&-或exec 0>&-,关闭标准输出
14 <&- 关闭某个输入文件描述符。用法格式:exec fd>&- exec <&-或exec 1<&-关闭标准输入
15 & 与号。如果命令后面跟上一个&符号,这个命令将会在后台运行。 使用格式:command&
16 / 斜杠。主要有两种作用。
(1)作为路径的分隔符,路径中仅有一个斜杆表示根目录,以斜杆开头的路径表示从根目录开始的路径;
(2)在作为运算符的时候,表示除法符号。
17 () 一对小括号。主要有两种用法:
(1)命令组。括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用。括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格。
(2)用于初始化数组。如 array=(a b c d)
18 {} 一对大括号。代码块标识符,一般用于函数定义时表明函数体。
19 <<< 三个小于号。作用就是将后面的内容作为前面命令的标准输入。 grep a <<< "$VARIABLE",意思就是在 VARIABLE 这个变量值里查找字符 a。
20 >| 大于号与竖杠。功能同 >,但即便设置了 noclobber 属性时也会强制复盖file文件。shell设置了noclobber属性表明已存在的文件不能被重定向输出覆盖。
21 <> 标准输入与输出重定向运算符 exec 6<>filename,通过 exec 命令,以读写的方式将文件描述符 6 绑定到指定文件。
2.5.2 命令功能符
序号 符号 作用 示例
61 . 点号。
1.相当于bash内建命令source,如:
#!/bin/bash;
. data-file#包含data-file;
2.作为文件名的一部分,在文件名的开头,表示该文件为隐藏文件,ls 一般不显示出来(ls -a 可以显示);
3.作为目录名,一个点代表当前目录,两个点号代表上层目录(当前目录的父目录)。注意,两个以上的点不出现,除非你用引号(单/双)包围作为点号字符本身;
4.正则表达式中,点号表示任意一个字符。
62 : 冒号。是 Shell 的空命令,什么也不做,但是返回 true。用法比较多,主要有:
(1)可做 while 死循环的条件;
(2)占位符,if 某一分支什么都不做的时候;
(3)域分隔符,比如环境变量 PATH 或 passwd 中,都有冒号作为域分隔符的存在;
(4)清空文件。因为冒号不向标准输出打印任何内容,所以可以用来清空文件,如 :>file
(5)配合${:=}给未定义或为空的变量赋值,示例:: ${abc:=1234};echo $abc,输出 1234
2.6 运算符
Shel 运算符比较多,大致可以分为如下几类:
算数运算符
关系运算符
逻辑运算符
字符串运算符
文件运算符
2.6.1 算术运算符
序号 符号 作用 示例
1 + 加法 a=10;b=20;expr $a + $b结果为 30。注意空格
2 - 减法 expr $a - $b 结果为-10
3 * 乘法 expr $a * $b 结果为200
4 / 除法 expr $b / $a 结果为2
5 % 取余 expr $b % $a 结果为 0
6 = 赋值 a=$b,将把变量 b 的值赋给 a
7 (()) 双小括号算术运算符,用于 expr 命令的替代,即支持算术表达式,而无需 expr 命令 for((i=0;i<10;++i))或者((out=$a*$b))或者if(($a==$b));then ... fi,无需添加空格了,更加符合 C 的编程语法
8 ** 双星号。算术运算中表示求幂运算
9 , 逗号运算符,用法主要有两个:
(1)用在连接一连串的数学表达式中,这串数学表达式均被求值,但只有最后一个求值结果被返回。
(2)用于参数替代中,表示首字母小写,如果是两个逗号,则表示全部小写,注意,这个特性在 bash version 4 的时候被添加。 见下文
逗号运算符用法示例:
(1)用在连接一连串的数学表达式中。
#!/bin/bash
t1=$((a=5+1, b=7+2))
echo t1=$t1, a=$a, b=$b
# 输出
t1=9, a=6, b=9
1
2
3
4
5
6
(2)用于参数替代中。
a="ATest"
echo ${a,}
echo ${a,,}
# 输出
aTest
atest
1
2
3
4
5
6
7
2.6.2 关系运算符
序号 符号 作用 示例
10 [] 一对方括号,用于判断条件是否成立 [ $a == $b ],注意添加 4 个空格
11 [[]] 两对方括号,是对 [] 的扩展,可使用 <、>、&&、|| 等运算符 [[ $a>$b ]],只需要添加左右两边两个空格。注意:使用 == 与 != 时,仍需要 4 个空格
12 -eq 检测两个数是否相等,相等返回 true [ $a -eq $b ] 返回 true
13 == 检测两个数是否相等,作用同-eq [ $a == $b ] 返回 true
14 -ne 检测两个数是否相等,不相等返回 true [ $a -ne $b ] 返回 true
15 != 作用同 -ne [ $a != $b ] 返回 true
16 -gt 检测左边的数是否大于右边的,如果是,则返回 true [ $a -gt $b ] 返回 false
17 -lt 检测左边的数是否小于右边的,如果是,则返回 true [ $a -lt $b ] 返回 true
18 -ge 检测左边的数是否大等于右边的,如果是,则返回 true [ $a -ge $b ] 返回 false
19 -le 检测左边的数是否小于等于右边的,如果是,则返回 true [ $a -le $b ] 返回 true
注意:
(1)运算符 [] 与 [[]] 的区别?
[] 实际上是 Bash 中 test 命令的简写,即所有的 [ expression ] 等于 test expression。而[[ expression ]] 是 Bash 中真正的条件判断语句,其语法更符合编程习惯,建议使用。
(2)Shell 中没有 <= 与 >= 运算符,只能使用-le与-ge替代。
2.6.3 逻辑运算符
序号 符号 作用 示例
20 ! 非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true
21 -o 或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true
22 -a 与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false
23 || 或运算符,与 && 作用相反,也有两种用法。
(1)用于条件判断,需与 [[]] 配合使用。两个表达式有一个为 true 就返回 true。
(2)命令连接:command1 || command2,左边的命令返回 false(即返回非 0,执行失败),右边的命令才能够被执行。 [[ $a < 20 || $a > 19 ]] 返回 true
24 && 与运算符,有两种用法。
(1)用于条件判断,需与 [[]] 配合使用。两个表达式都为true才返回true。
(2)命令连接。command1 && command2。左边的命令返回真(即返回 0,成功被执行),右边的命令才能够被执行。 [[ $a < 20 && $a > 20 ]] 返回 false
2.6.4 字符串运算符
序号 符号 作用 示例
25 = 检测两个字符串是否相等,相等返回 true [ "$a" = "$b" ] 返回 false
26 != 检测两个字符串是否相等,不相等返回 true。 [ "$a" != "$b" ] 返回 true
27 -z 检测字符串长度是否为 0,为 0 返回 true。 [ -z "$a" ] 返回 false
28 -n 检测字符串长度是否为 0,不为 0 返回 true。 [ -n "$a" ] 返回 true
29 str 检测字符串是否为空,不为空返回 true。 [ "$a" ] 返回 true
30 =~ 正则表达式匹配运算符,用于匹配正则表达式的,配合 [[]] 使用 [[ ! $file =~ check$ ]] 判断 $file 是否是以 check 结尾
注意:
-z 不仅可以用来判断字符串长度是否为 0,也可以用来判断变量是否被申明。
# 如果变量 VAR 已申明,返回 false
if [ -z ${var+x} ]; then echo "var is unset"; else echo "var is set to '$var'"; fi
1
2
具体可参见 parameter expansion。
2.6.5 文件运算符
文件运算符用于检测文件的各种属性。
序号 符号 作用 示例
31 -b 文件存在且是块设备文件 [ -b /dev/vda1 ] 返回 true
32 -c 文件存在且是字符设备文件 [ -c /dev/stdin ] 返回 true
33 -d 文件存在且是目录 [ -d / ] 返回 true
34 -e 文件(包括目录)是否存在 [ -e / ] 返回 true
35 -f 文件存在且是普通文件(既不是目录,也不是设备文件) [ -f /etc/passwd] 返回 true
36 -g 文件存在且设置了 SGID 位 [ -g /usr/bin/passwd ] 返回 false
37 -G 文件存在且属于有效组 ID [ -G /etc/passwd ] 返回 true
38 -h 文件存在且是软链接。同 -L [ -h /etc/passwd ] 返回 false
39 -k 文件存在且设置了粘着位(Sticky Bit) [ -k /tmp ] 返回 true
40 -L 文件存在且是软链接。同 -h [ -L /etc/passwd ] 返回 false
41 -O 文件存在且属于有效用户ID [ -O /etc/passwd ] 返回 true
42 -p 文件存在且是具名管道 [ -p /etc/passwd ] 返回 false
43 -r 文件存在且可读 [ -r /etc/passwd ] 返回 true
44 -s 文件存在且不为空 [ -s /etc/passwd ] 返回 true
45 -S 文件存在且是套接字(socket) [ -s /etc/passwd ] 返回 false
46 -u 文件存在且设置了 SUID 位 [ -s /usr/bin/passwd ] 返回 true
47 -w 文件存在且可写 [ -w /etc/shadow ] 返回 false
48 -x 文件存在且可执行 [ -x /usr/bin/passwd ] 返回 true
49 -ef 两个文件是否为同一个文件。主要看文件设备号与 inode 是否一致 [ /usr/bin/passwd -ef /etc/passwd ] 返回 false
50 -nt 文件 FILE1 是否比 FILE2 新(修改时间新) [ /usr/bin/passwd -nt /etc/passwd ] 返回 false
51 -ot 文件 FILE1 是否比 FILE2 旧(修改时间旧) [ /usr/bin/passwd -ot /etc/passwd ] 返回 true
这里附带说明一下 Linux 下文件的类型。
- 普通文件
d 目录
b 块设备
c 字符设备
p 命名管道
l 符号链接
s 套接字
1
2
3
4
5
6
7
3.小结
断断续续历时 3 个多星期,终于完成了这篇 blog,后续遇到新的特殊字符,我会及时更新。
是不是被上面的多如繁星的特殊字符弄的晕头转向,你都了解和用过吗?其实没有必要花费大量的时间去死记硬背,可当做手册参考,在需要使用的时候再去了解其意义和用法是不迟的。Shell 的特殊字符真的是太多了,我可以很负责任的告诉你,上面总结的其实只是一部分,还有很多没有列出来。
对于上面特殊字符的解释,因未参考到权威的资料,再加上本人有些字符未亲自实践和使用过,难免片面甚至错误,仅供参考!如有遗漏或错误,欢迎大家不吝指教,留言告知,thx!
————————————————
版权声明:本文为CSDN博主「恋喵大鲤鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/K346K346/article/details/51819236
参考:
https://blog.csdn.net/K346K346/article/details/51819236
https://blog.csdn.net/blackfwhite/article/details/80382849
https://www.cnblogs.com/ginvip/p/6255644.html