df-sed-awk-du-grep
df-sed-awk-du-grep学习笔记
参考来源:
df命令:
df(英文全拼:disk free) 命令用于显示目前在 Linux 系统上的文件系统磁盘使用情况统计。
语法:
df [选项]... [FILE]... |
- 文件-a, —all 包含所有的具有 0 Blocks 的文件系统
- 文件—block-size={SIZE} 使用 {SIZE} 大小的 Blocks
- 文件-h, —human-readable 使用人类可读的格式(预设值是不加这个选项的…)
- 文件-H, —si 很像 -h, 但是用 1000 为单位而不是用 1024
- 文件-i, —inodes 列出 inode 资讯,不列出已使用 block
- 文件-k, —kilobytes 就像是 —block-size=1024
- 文件-l, —local 限制列出的文件结构
- 文件-m, —megabytes 就像 —block-size=1048576
- 文件—no-sync 取得资讯前不 sync (预设值)
- 文件-P, —portability 使用 POSIX 输出格式
- 文件—sync 在取得资讯前 sync
- 文件-t, —type=TYPE 限制列出文件系统的 TYPE
- 文件-T, —print-type 显示文件系统的形式
- 文件-x, —exclude-type=TYPE 限制列出文件系统不要显示 TYPE
- 文件-v (忽略)
- 文件—help 显示这个帮手并且离开
- 文件—version 输出版本资讯并且离开
实例:
使用```bash
kizaiwsl2@KIZAI-DESKTOP:~$ df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sdb 263174212 1465208 248270848 1% /
tmpfs 9706744 0 9706744 0% /mnt/wsl
tools 499207124 377409084 121798040 76% /init
none 9704660 0 9704660 0% /dev
none 9706744 4 9706740 1% /run
none 9706744 0 9706744 0% /run/lock
none 9706744 0 9706744 0% /run/shm
none 9706744 0 9706744 0% /run/user
tmpfs 9706744 0 9706744 0% /sys/fs/cgroup
C:\ 499207124 377409084 121798040 76% /mnt/c
D:\ 409599996 303194164 106405832 75% /mnt/d
F:\ 567158780 356728696 210430084 63% /mnt/fdf filename
指定文件夹显示磁盘使用信息:-h选项,通过它可以产生人类可读的格式df命令的输出:kizaiwsl2@KIZAI-DESKTOP:/home$ ls
kizaiwsl2 script test
kizaiwsl2@KIZAI-DESKTOP:/home$ df test/
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sdb 263174212 1465208 248270848 1% /
kizaiwsl2@KIZAI-DESKTOP:/home$kizaiwsl2@KIZAI-DESKTOP:/home$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sdb 251G 1.4G 237G 1% /
tmpfs 9.3G 0 9.3G 0% /mnt/wsl
tools 477G 360G 117G 76% /init
none 9.3G 0 9.3G 0% /dev
none 9.3G 4.0K 9.3G 1% /run
none 9.3G 0 9.3G 0% /run/lock
none 9.3G 0 9.3G 0% /run/shm
none 9.3G 0 9.3G 0% /run/user
tmpfs 9.3G 0 9.3G 0% /sys/fs/cgroup
C:\ 477G 360G 117G 76% /mnt/c
D:\ 391G 290G 102G 75% /mnt/d
F:\ 541G 341G 201G 63% /mnt/fsed命令:
- sed 命令是利用脚本来处理文本文件。
- sed 可依照脚本的指令来处理、编辑文本文件。
- sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。
语法:
sed [-hnV][-e<script>][-f<script文件>][文本文件]
参数说明:
- -e<脚本>或—expression=<脚本> 以选项中指定的script来处理输入的文本文件。
- -f<脚本>或—file=<脚本> 以选项中指定的script文件来处理输入的文本文件。
- -h或—help 显示帮助。
- -n或—quiet或—silent 仅显示script处理后的结果。
-V或—version 显示版本信息。
动作说明:
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
- c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
- d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
- i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
- p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
- s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
实例:
使用vim test
新建一个test文件进行测试,输入Hello Linux
再使用cat test
查看内容
kizaiwsl2@KIZAI-DESKTOP:/home/test$ cat test |
在test文件的第一行后添加一行,并将结果输出到标准输出,在命令行提示符下输入如下命令:
sed -e 1a\newLine test |
数据的搜寻并显示
例如:显示磁盘名称包含字母d的信息并使用-h人类可阅读方式打印出来:
kizaiwsl2@KIZAI-DESKTOP:/home/test$ df -h | sed -n '/d/p' |
awk命令:
- AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。
- 之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。
语法:
awk [选项参数] 'script' var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)选项参数说明:
命令 | 效果 |
---|---|
-F fs or —field-separator fs | 指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。 |
-v var=value or —asign var=value | 赋值一个用户定义变量。 |
-f scripfile or —file scriptfile | 从脚本文件中读取awk命令。 |
-mf nnn and -mr nnn | 对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。 |
-W compact or —compat, -W traditional or —traditional | 在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。 |
-W copyleft or —copyleft, -W copyright or —copyright | 打印简短的版权信息。 |
-W help or —help, -W usage or —usage | 打印全部awk选项和每个选项的简短说明。 |
-W lint or —lint | 打印不能向传统unix平台移植的结构的警告。 |
-W lint-old or —lint-old | 打印关于不能向传统unix平台移植的结构的警告。 |
-W posix | 打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符和=不能代替^和^=;fflush无效。 |
-W re-interval or —re-inerval | 允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。 |
-W source program-text or —source program-text | 使用program-text作为源代码,可与-f命令混用。 |
-W version or —version | 打印bug报告信息的版本。 |
运算符
运算符 | 描述 |
---|---|
= += -= = /= %= ^= *= | 赋值 |
?: | C条件表达式 |
&& | 逻辑与 |
~ 和 !~ | 匹配正则表达式和不匹配正则表达式 |
< <= > >= != == | 关系运算符 |
空格 | 连接 |
+ - | 加,减 |
* / % | 乘,除与求余 |
+ - ! | 一元加,减和逻辑非 |
^ * | 求幂 |
++ — | 增加或减少,作为前缀或后缀 |
$ | 字段引用 |
in | 数组成员 |
内建变量
变量 | 描述 |
---|---|
$n | 当前记录的第n个字段,字段间由FS分隔 |
$0 | 完整的输入记录 |
ARGC | 命令行参数的数目 |
ARGIND | 命令行中当前文件的位置(从0开始算) |
ARGV | 包含命令行参数的数组 |
CONVFMT | 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组 |
ERRNO | 最后一个系统错误的描述 |
FIELDWIDTHS | 字段宽度列表(用空格键分隔) |
FILENAME | 当前文件名 |
FNR | 各文件分别计数的行号 |
FS | 字段分隔符(默认是任何空格) |
IGNORECASE | 如果为真,则进行忽略大小写的匹配 |
NF | 一条记录的字段的数目 |
NR | 已经读出的记录数,就是行号,从1开始 |
OFMT | 数字的输出格式(默认值是%.6g) |
OFS | 输出字段分隔符,默认值与输入字段分隔符一致。 |
ORS | 输出记录分隔符(默认值是一个换行符) |
RLENGTH | 由match函数所匹配的字符串的长度 |
RS | 记录分隔符(默认是一个换行符) |
RSTART | 由match函数所匹配的字符串的第一个位置 |
SUBSEP | 数组下标分隔符(默认值是/034) |
实例:
打印文件Gitlab-Runner/company-tech-doc/DevOps_Doc/Shell/Shell_Example/test.csv中所有的行,不指定任何模式:
lemu-devops@lemudevops:~/Gitlab-Runner/company-tech-doc/DevOps_Doc/Shell/Shell_Example$ awk '//{print}' test.csv |
指定匹配Lemu_Tech
模式,因此awk匹配文件test.csv中的Lemu_Tech
的那些行:
lemu-devops@lemudevops:~/Gitlab-Runner/company-tech-doc/DevOps_Doc/Shell/Shell_Example$ awk '/Lemu_Tech/{print}' test.csv |
使用通配符(.)
,我这里用它来匹配包含:A、Ad、Admin的字符串:
lemu-devops@lemudevops:~/Gitlab-Runner/company-tech-doc/DevOps_Doc/Shell/Shell_Example$ awk '/.Ad/{print}' test.csv |
结合结合集合 [ character(s) ] 使用 awk进行匹配,下面打印含有以l
、d
、D
、o
字符的数据:
lemu-devops@lemudevops:~/Gitlab-Runner/company-tech-doc/DevOps_Doc/Shell/Shell_Example$ awk '/[ldDo]/{print}' test.csv |
计算文件大小:
# 计算该目录下.csv文件的大小 |
正则表达式:
- 正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
- 正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为”元字符”)组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
普通字符:
| 字符 | 描述 |
|:———-|:————————————————————————————————————————————————————————-|
| [ABC] | 匹配 […] 中的所有字符,例如 [aeiou] 匹配字符串 “google runoob taobao” 中所有的 e o u a 字母。 |
| ABC | 匹配除了 […] 中字符的所有字符,例如 aeiou 匹配字符串 “google runoob taobao” 中除了 e o u a 字母的所有字母。 |
| [A-Z] | [A-Z] 表示一个区间,匹配所有大写字母,[a-z] 表示所有小写字母。 |
| . | 匹配除换行符(\n、\r)之外的任何单个字符,相等于 \n\r。 |
| [\s\S] | 匹配所有。\s 是匹配所有空白符,包括换行,\S 非空白符,不包括换行。 |
| \w | 匹配字母、数字、下划线。等价于 [A-Za-z0-9_] |
非打印字符:
字符 | 描述 |
---|---|
\cx | 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c’ 字符。 |
\f | 匹配一个换页符。等价于 \x0c 和 \cL。 |
\n | 匹配一个换行符。等价于 \x0a 和 \cJ。 |
\r | 匹配一个回车符。等价于 \x0d 和 \cM。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意 Unicode 正则表达式会匹配全角空格符。 |
\S | 匹配任何非空白字符。等价于 \f\n\r\t\v。 |
\t | 匹配一个制表符。等价于 \x09 和 \cI。 |
\v | 匹配一个垂直制表符。等价于 \x0b 和 \cK。 |
特殊字符
特别字符 | 描述 |
---|---|
$ | 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n’ 或 ‘\r’。要匹配 $ 字符本身,请使用 \$。 |
( ) | 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 ( 和 )。 |
* | 匹配前面的子表达式零次或多次。要匹配 字符,请使用 \。 |
+ | 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 +。 |
. | 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 . 。 |
[ | 标记一个中括号表达式的开始。要匹配 [,请使用 [。 |
? | 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。 |
\ | 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, ‘n’ 匹配字符 ‘n’。’\n’ 匹配换行符。序列 ‘\\’ 匹配 “\”,而 ‘(‘ 则匹配 “(“。 |
^ | 匹配输入字符串的开始位置,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。要匹配 ^ 字符本身,请使用 \^。 |
{ | 标记限定符表达式的开始。要匹配 {,请使用 {。 |
限定符
字符 | 描述 |
---|---|
* | 匹配前面的子表达式零次或多次。例如,zo 能匹配 “z” 以及 “zoo”。 等价于{0,}。 |
+ | 匹配前面的子表达式一次或多次。例如,’zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。 |
? | 匹配前面的子表达式零次或一次。例如,”do(es)?” 可以匹配 “do” 、 “does” 中的 “does” 、 “doxy” 中的 “do” 。? 等价于 {0,1}。 |
{n} | n 是一个非负整数。匹配确定的 n 次。例如,’o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。 |
{n,} | n 是一个非负整数。至少匹配n 次。例如,’o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。’o{1,}’ 等价于 ‘o+’。’o{0,}’ 则等价于 ‘o*’。 |
{n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,”o{1,3}” 将匹配 “fooooood” 中的前三个 o。’o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。 |
定位符:
字符 | 描述 |
---|---|
^ | 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与 \n 或 \r 之后的位置匹配。 |
$ | 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与 \n 或 \r 之前的位置匹配。 |
\b | 匹配一个单词边界,即字与空格间的位置。 |
\B | 非单词边界匹配。 |
du命令
- Linux du (英文全拼:disk usage)命令用于显示目录或文件的大小。
- du 会显示指定的目录或文件所占用的磁盘空间。
语法:
du [-abcDhHklmsSx][-L <符号连接>][-X <文件>][--block-size][--exclude=<目录或文件>][--max-depth=<目录层数>][--help][--version][目录或文件] |
参数说明:
参数 | 功能 |
---|---|
-a或-all | 显示目录中个别文件的大小。 |
-b或-bytes | 显示目录或文件大小时,以byte为单位。 |
-c或—total | 除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。 |
-D或—dereference-args | 显示指定符号连接的源文件大小。 |
-h或—human-readable | 以K,M,G为单位,提高信息的可读性。 |
-H或—si | 与-h参数相同,但是K,M,G是以1000为换算单位。 |
-k或—kilobytes | 以1024 bytes为单位。 |
-l或—count-links | 重复计算硬件连接的文件。 |
-L<符号连接>或—dereference<符号连接> | 显示选项中所指定符号连接的源文件大小。 |
-m或—megabytes | 以1MB为单位。 |
-s或—summarize | 仅显示总计。 |
-S或—separate-dirs | 显示个别目录的大小时,并不含其子目录的大小。 |
-x或—one-file-xystem | 以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过。 |
-X<文件>或—exclude-from=<文件> | 在<文件>指定目录或文件。 |
—exclude=<目录或文件> | 略过指定的目录或文件。 |
—max-depth=<目录层数> | 超过指定层数的目录后,予以忽略。 |
—help | 显示帮助。 |
—version | 显示版本信息。 |
实例:
显示DevOps文件夹和文件的所占空间,使用人类可读性的方式:
lemu-devops@lemudevops:~/Gitlab-Runner/company-tech-doc/DevOps_Doc$ du -h |
显示指定文件的大小:
lemu-devops@lemudevops:~/Gitlab-Runner/company-tech-doc/DevOps_Doc$ du -h 每日工作计划.md |
grep命令:
- Linux grep 命令用于查找文件里符合条件的字符串。
- grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。
语法:
grep [-abcEFGhHilLnqrsvVwxy][-A<显示行数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...] |
参数说明
参数 | 功能 |
---|---|
-a 或 —text | 不要忽略二进制的数据。 |
-A<显示行数> 或 —after-context=<显示行数> | 除了显示符合范本样式的那一列之外,并显示该行之后的内容。 |
-b 或 —byte-offset | 在显示符合样式的那一行之前,标示出该行第一个字符的编号。 |
-B<显示行数> 或 —before-context=<显示行数> | 除了显示符合样式的那一行之外,并显示该行之前的内容。 |
-c 或 —count | 计算符合样式的列数。 |
-C<显示行数> 或 —context=<显示行数>或-<显示行数> | 除了显示符合样式的那一行之外,并显示该行之前后的内容。 |
-d <动作> 或 —directories=<动作> | 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。 |
-e<范本样式> 或 —regexp=<范本样式> | 指定字符串做为查找文件内容的样式。 |
-E 或 —extended-regexp | 将样式为延伸的正则表达式来使用。 |
-f<规则文件> 或 —file=<规则文件> | 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。 |
-F 或 —fixed-regexp | 将样式视为固定字符串的列表。 |
-G 或 —basic-regexp | 将样式视为普通的表示法来使用。 |
-h 或 —no-filename | 在显示符合样式的那一行之前,不标示该行所属的文件名称。 |
-H 或 —with-filename | 在显示符合样式的那一行之前,表示该行所属的文件名称。 |
-i 或 —ignore-case | 忽略字符大小写的差别。 |
-l 或 —file-with-matches | 列出文件内容符合指定的样式的文件名称。 |
-L 或 —files-without-match | 列出文件内容不符合指定的样式的文件名称。 |
-n 或 —line-number | 在显示符合样式的那一行之前,标示出该行的列数编号。 |
-o 或 —only-matching | 只显示匹配PATTERN 部分。 |
-q 或 —quiet或—silent | 不显示任何信息。 |
-r 或 —recursive | 此参数的效果和指定”-d recurse”参数相同。 |
-s 或 —no-messages | 不显示错误信息。 |
-v 或 —invert-match | 显示不包含匹配文本的所有行。 |
-V 或 —version | 显示版本信息。 |
-w 或 —word-regexp | 只显示全字符合的列。 |
-x —line-regexp | 只显示全列符合的列。 |
-y | 此参数的效果和指定”-i”参数相同。 |
实例
在目录文件下查找后缀csv
字样的文件包含date
字符串字符串。
lemu-devops@lemudevops:~/Gitlab-Runner/company-tech-doc/DevOps_Doc/Shell/Shell_Example$ grep date *csv |
以递归方式查找符合条件的文件。查找指定目录下所有文件中包含used
的文件,并打印该字符串所在行的内容。
lemu-devops@lemudevops:~/Gitlab-Runner/company-tech-doc/DevOps_Doc/Shell/Shell_Example$ grep -r date |
反向查找。前面各个例子是查找并打印出符合条件的行,通过”-v”参数可以打印出不符合条件行的内容。现在查找文件名中包含csv
的文件不包含date
的行:
lemu-devops@lemudevops:~/Gitlab-Runner/company-tech-doc/DevOps_Doc/Shell/Shell_Example$ grep -v date *csv |
使用正则表达式匹配文件内容:匹配字母a-u的内容打印出来
lemu-devops@lemudevops:~/Gitlab-Runner/company-tech-doc/DevOps_Doc/Shell/Shell_Example$ grep -e "[a-u]" *csv* |
其他示例:
正则表达式 | 描述 | ||
---|---|---|---|
/\b([a-z]+) \1\b/gi | 一个单词连续出现的位置。 | ||
/(\w+):\/\/(/:+)(:\d)?(# )/ | 将一个URL解析为协议、域、端口及相对路径。 | ||
/^(?:Chapter | Section) [1-9][0-9]{0,1}$/ | 定位章节的位置。 | |
/[-a-z]/ | a至z共26个字母再加一个-号。 | ||
/ter\b/ | 可匹配chapter,而不能匹配terminal。 | ||
/\Bapt/ | 可匹配chapter,而不能匹配aptitude。 | ||
/Windows(?=95 | 98 | NT )/ | 可匹配Windows95或Windows98或WindowsNT,当找到一个匹配后,从Windows后面开始进行下一次的检索匹配。 |
/^\s*$/ | 匹配空行。 | ||
/\d{2}-\d{5}/ | 验证由两位数字、一个连字符再加 5 位数字组成的 ID 号。 | ||
/<\s(\S+)(\s>)?>[\s\S]<\s\/\1\s*>/ | 匹配 HTML 标记。 |
shell中各种括号的作用()、(())、[]、[[]]、{}
单小括号()
- ①命令组。括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用。括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格。
- ②命令替换。等同于
cmd
,shell扫描一遍命令行,发现了$(cmd)结构,便将$(cmd)中的cmd执行一次,得到其标准输出,再将此输出放到原来命令。有些shell不支持,如tcsh。 - ③用于初始化数组。如:array=(a b c d)
双小括号(())
- ①整数扩展。这种扩展计算是整数型的计算,不支持浮点型。((exp))结构扩展并计算一个算术表达式的值,如果表达式的结果为0,那么返回的退出状态码为1,或者 是”假”,而一个非零值的表达式所返回的退出状态码将为0,或者是”true”。若是逻辑判断,表达式exp为真则为1,假则为0。
- ②只要括号中的运算符、表达式符合C语言运算规则,都可用在$((exp))中,甚至是三目运算符。作不同进位(如二进制、八进制、十六进制)运算时,输出结果全都自动转化成了十进制。如:echo $((16#5f)) 结果为95 (16进位转十进制)
- ③单纯用 (( )) 也可重定义变量值,比如 a=5; ((a++)) 可将 $a 重定义为6
- ④常用于算术运算比较,双括号中的变量可以不使用$符号前缀。括号内支持多个表达式用逗号分开。 只要括号中的表达式符合C语言运算规则,比如可以直接使用for((i=0;i<5;i++)), 如果不使用双括号, 则为for i in
seq 0 4
或者for i in {0..4}。再如可以直接使用if (($i<5)), 如果不使用双括号, 则为if [ $i -lt 5 ]。
单中括号[]
- ①bash 的内部命令,[和test是等同的。如果我们不用绝对路径指明,通常我们用的都是bash自带的命令。if/test结构中的左中括号是调用test的命令标识,右中括号是关闭条件判断的。这个命令把它的参数作为比较表达式或者作为文件测试,并且根据比较的结果来返回一个退出状态码。if/test结构中并不是必须右中括号,但是新版的Bash中要求必须这样。
- ②Test和[]中可用的比较运算符只有==和!=,两者都是用于字符串比较的,不可用于整数比较,整数比较只能使用-eq,-gt这种形式。无论是字符串比较还是整数比较都不支持大于号小于号。如果实在想用,对于字符串比较可以使用转义形式,如果比较”ab”和”bc”:[ ab \< bc ],结果为真,也就是返回状态为0。[ ]中的逻辑与和逻辑或使用-a 和-o 表示。
- ③字符范围。用作正则表达式的一部分,描述一个匹配的字符范围。作为test用途的中括号内不能使用正则。
- ④在一个array 结构的上下文中,中括号用来引用数组中每个元素的编号。
双中括号[[]]
- ①[[是 bash 程序语言的关键字。并不是一个命令,[[ ]] 结构比[ ]结构更加通用。在[[和]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换。
- ②支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。
- ③使用[[ … ]]条件判断结构,而不是[ … ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。比如可以直接使用if [[ $a != 1 && $a != 2 ]], 如果不适用双括号, 则为if [ $a -ne 1] && [ $a != 2 ]或者if [ $a -ne 1 -a $a != 2 ]。
- ④bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。
大括号{}
- ①大括号拓展。(通配(globbing))将对大括号中的文件名做扩展。在大括号中,不允许有空白,除非这个空白被引用或转义。第一种:对大括号中的以逗号分割的文件列表进行拓展。如 touch {a,b}.txt 结果为a.txt b.txt。第二种:对大括号中以点点(..)分割的顺序文件列表起拓展作用,如:touch {a..d}.sh 结果为a.txt b.txt c.txt d.txt
- ②代码块,又被称为内部组,这个结构事实上创建了一个匿名函数 。与小括号中的命令不同,大括号内的命令不会新开一个子shell运行,即脚本余下部分仍可使用括号内变量。括号内的命令间用分号隔开,最后一个也必须有分号。{}的第一个命令和左括号之间必须要有一个空格。
- ①${a} 变量a的值, 在不引起歧义的情况下可以省略大括号。
- ②$(cmd) 命令替换,和
cmd
效果相同,结果为shell命令cmd的输,过某些Shell版本不支持$()形式的命令替换, 如tcsh。 - ③$((expression)) 和
exprexpression
效果相同, 计算数学表达式exp的数值, 其中exp只要符合C语言的运算规则即可, 甚至三目运算符和逻辑表达式都可以计算。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 KizaiBlog!
评论