常用命令
head
head 命令可用于查看文件的开头部分的内容,有一个常用的参数 -n 用于显示行数,默认为 10,即显示 10 行的内容。
命令格式:
1 | head [参数] [文件] |
参数:
- -q 隐藏文件名
- -v 显示文件名
- -c<数目> 显示字节数
- -n<行数> 显示行号
例
查看/etc/passwd 文件前10行
1 | head /etc/passwd |
查看/etc/passwd 文件前5行
1 | head -n5 /etc/passwd |
查看/etc/passwd文件前20个字节
1 | head -c20 /etc/passwd |
tail
tail 命令可用于查看文件的末尾内容,有一个常用的参数 -n 用于显示行数,默认为 10,即显示 10 行的内容。
命令格式:
1 | tail [参数] [文件] |
参数:
- -f 循环读取
- -q 不显示处理信息
- -v 显示详细的处理信息
- -c<数目> 显示的字节数
- -n<行数> 显示文件的尾部 n 行内容
- –pid=PID 与-f合用,表示在进程ID,PID死掉之后结束
- -q, –quiet, –silent 从不输出给出文件名的首部
- -s, –sleep-interval=S 与-f合用,表示在每次反复的间隔休眠S秒
例
查看test.log文件后10行
1 | tail test.log |
查看test.log文件后5行
1 | tail -n5 test.log |
查看test.log的实时增长情况
1 | tail -f test.log |
此命令显示test.log 文件的最后 10 行。当将某些行添加至 test.log 文件时,tail 命令会继续显示这些行。
cut
取出文本指定的列,默认以空格或table键进行分割
参数:
- -d 指定分割符
- -f 指定获取的列号
例
test.txt
取出test.txt文件中的第二列
1 | cut -f2 test.txt |
uniq
去除重复的内容。
参数:
- -d 仅输出有重复的元素
- -c 输出重复元素的个数
test.txt
1 | $ cat test.txt |
去除重复元素
1 | $ uniq test.txt |
输出有重复的元素
1 | $ uniq -d test.txt |
输出元素重复的个数
1 | $ uniq -c test.txt |
sort
sort 命令将以默认的方式将文本文件的第一列以ASCII 码的次序排列,并将结果输出到标准输出。
参数:
- -r 倒序
例
1 | $ cat test.txt |
使用sort对文件内容排序
1 | $ sort test.txt |
对文件内容按照倒序排列
1 | $ sort -r test.txt |
wc(word count)
计算文件的Byte数、字数、或是列数。
参数
- -c或–bytes或–chars 只显示Bytes数。
- -l或–lines 显示行数。
- -w或–words 只显示字数。
例
1 | $ cat test.txt |
统计test.txt文件的行数、单词数、字节数
1 | $ wc test.txt |
只统计test.txt文件的行数
1 | $ wc -l test.txt |
只统计test.txt文件的单词数
1 | $ wc -w test.txt |
只统计test.txt文件的行数的字节数
1 | $ wc -c test.txt |
注:
更多linux命令可以参考:linux命令大全
变量
全局变量
查看全局变量
1 | $ env |
定义全局变量
方法一:
1
2test_var=12345 # 变量名=变量值
export test_var # export 变量名方法二:
1
export test_var=12345 # export 变量名=变量值
通过export
定义全局变量后,可在env
中查看到。
需要注意的是,export
定义的全局变量是临时的,即退出终端或换个shell就没有了。
如果想要定义永久的全局变量,有两种方法:
方法一:
shell启动的时候会先启动这两个文件,因此可以在这个文件里写入export var=xxx来定义全局变量,这样每个终端打开后都会执行这句来定义全局变量。
方法二:
在
/etc/profile
文件中写入export var=xxx来定义全局变量。
局部变量
定义
局部变量定义的四种方式:
1 | # 方式一:变量名=变量值,变量值必须是一个整体,中间没有特殊字符,等号两侧不能有空格 |
在shell
脚本中无法使用局部变量:
定义一个局部变量x
并在脚本test.sh
中引用了变量x
1 | $ x='这是一个局部变量' |
test.sh
1 |
|
运行脚本,无法引用变量x
1 | $ sh test.sh |
若将x
定义为全局变量
1 | $ export x='这是一个局部变量' |
x
引用成功。
引用变量
通过$变量名
来引用变量。
注意:
''单引号
和""双引号
引用变量是有区别的:
内置变量
符号 | 含义 |
---|---|
$0 | 获取当前执行的shell脚本文件名,包括脚本路径 |
$n | 获取当前执行的shell脚本的第n个参数值,n=1~9,如果n大于9就要用大括号括起来${10} |
$# | 获取当前shell命令行中的参数总个数 |
$? | 获取执行上一个指令的返回值(0为成功,非0为失败) |
*$** | 获取所有参数 |
例
test.sh
1 |
|
执行test.sh
脚本:
1 | $ sh test.sh 10 20 30 40 50 60 70 80 90 100 |
shell基本运算符
算术运算符
定义变量a
=10,变量b
=20
运算符 | 说明 | 举例 |
---|---|---|
+ | 加法 | expr $a + $b 结果为 30。 |
- | 减法 | expr $a - $b 结果为 -10。 |
* | 乘法 | expr $a \* $b 结果为 200。 |
/ | 除法 | expr $b / $a 结果为 2。 |
% | 取余 | expr $b % $a 结果为 0。 |
= | 赋值 | a=$b 将把变量 b 的值赋给 a。 |
== | 相等。用于比较两个数字,相同则返回 true。 | [ $a == $b ] 返回 false。 |
!= | 不相等。用于比较两个数字,不相同则返回 true。 | [ $a != $b ] 返回 true。 |
特别注意: 在进行乘法运算的时候,由于*
有特殊含义,所以必须加上\
进行转义,\*
才能实现乘法运算。expr
出现>
、<
要用\
转义,不转义会被当做重定向符。
另外,算术表达式有两种写法:
$((算术表达式))
1
2
3
4
5
6[root@VM-0-2-centos ~] a=10
[root@VM-0-2-centos ~] b=20
[root@VM-0-2-centos ~] echo $((a+b)) # 变量可以不加$
30
[root@VM-0-2-centos ~] echo $(($a+$b))
30expr 算术表达式
如上列表所示。
关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
定义变量a
=10,变量b
=20
运算符 | 说明 | 举例 |
---|---|---|
-eq | 检测两个数是否相等,相等返回 true。 | [ $a -eq $b ] 返回 false。 |
-ne | 检测两个数是否不相等,不相等返回 true。 | [ $a -ne $b ] 返回 true。 |
-gt | 检测左边的数是否大于右边的,如果是,则返回 true。 | [ $a -gt $b ] 返回 false。 |
-lt | 检测左边的数是否小于右边的,如果是,则返回 true。 | [ $a -lt $b ] 返回 true。 |
-ge | 检测左边的数是否大于等于右边的,如果是,则返回 true。 | [ $a -ge $b ] 返回 false。 |
-le | 检测左边的数是否小于等于右边的,如果是,则返回 true。 | [ $a -le $b ] 返回 true。 |
逻辑运算符
定义变量a
=10,变量b
=20
运算符 | 说明 | 举例 |
---|---|---|
&& | 逻辑的 AND | [[ $a -lt 100 && $b -gt 100 ]] 返回 false |
|| | 逻辑的 OR | [[ $a -lt 100 || $b -gt 100 ]] 返回 true |
布尔运算符
定义变量a
=10,变量b
=20
运算符 | 说明 | 举例 |
---|---|---|
! | 非运算,表达式为 true 则返回 false,否则返回 true。 | [ ! false ] 返回 true。 |
-o | 或运算,有一个表达式为 true 则返回 true。 | [ $a -lt 20 -o $b -gt 100 ] 返回 true。 |
-a | 与运算,两个表达式都为 true 才返回 true。 | [ $a -lt 20 -a $b -gt 100 ] 返回 false。 |
字符串运算符
定义a="test"
,b="test1"
运算符 | 说明 | 举例 |
---|---|---|
= | 检测两个字符串是否相等,相等返回 true。 | [ $a = $b ] 返回 false。 |
!= | 检测两个字符串是否不相等,不相等返回 true。 | [ $a != $b ] 返回 true。 |
-z | 检测字符串长度是否为0,为0返回 true。 | [ -z $a ] 返回 false。 |
-n | 检测字符串长度是否不为 0,不为 0 返回 true。 | [ -n “$a” ] 返回 true。 |
$ | 检测字符串是否为空,不为空返回 true。 | [ $a ] 返回 true。 |
文件测试运算符
操作符 | 说明 | 举例 |
---|---|---|
-b file | 检测文件是否是块设备文件,如果是,则返回 true。 | [ -b $file ] 返回 false。 |
-c file | 检测文件是否是字符设备文件,如果是,则返回 true。 | [ -c $file ] 返回 false。 |
-d file | 检测文件是否是目录,如果是,则返回 true。 | [ -d $file ] 返回 false。 |
-f file | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 | [ -f $file ] 返回 true。 |
-g file | 检测文件是否设置了 SGID 位,如果是,则返回 true。 | [ -g $file ] 返回 false。 |
-k file | 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 | [ -k $file ] 返回 false。 |
-p file | 检测文件是否是有名管道,如果是,则返回 true。 | [ -p $file ] 返回 false。 |
-u file | 检测文件是否设置了 SUID 位,如果是,则返回 true。 | [ -u $file ] 返回 false。 |
-r file | 检测文件是否可读,如果是,则返回 true。 | [ -r $file ] 返回 true。 |
-w file | 检测文件是否可写,如果是,则返回 true。 | [ -w $file ] 返回 true。 |
-x file | 检测文件是否可执行,如果是,则返回 true。 | [ -x $file ] 返回 true。 |
-s file | 检测文件是否为空(文件大小是否大于0),不为空返回 true。 | [ -s $file ] 返回 true。 |
-e file | 检测文件(包括目录)是否存在,如果是,则返回 true。 | [ -e $file ] 返回 true。 |
条件表达式
返回值
条件成立返回0
,不成立返回1
。
1 | $ [ 1 -eq 1] |
if-else简写
1 | $ test_file="/test_file" |
[ 条件 ] && 结果1 || 结果2
该表达式相当于if-else
的简写,当条件成立,执行&&
后的语句,条件不成立,执行||
后的语句。
shell脚本格式
格式要求
在文件首行指定执行shell的程序以及相关说明
1
2
3
#Author: 古一
#Description: 测试脚本shell脚本文件后缀,建议为
.sh
脚本执行失败时,使用
exit
返回非零值,来退出程序默认缩进4个空格
shell脚本命名简单且见名知意
注释
单行注释
#
多行注释
1
2
3:<<!
这是注释
!
函数
格式
1 | # 格式一: |
例
编写shell脚本func_test.sh
1 |
|
运行结果:
1 | $ bash func_test.sh |
参数
1 | # 函数体中调用参数 |
在脚本内部传参
1 |
|
执行结果
1 | $ sh func_test.sh |
命令行传入参数
1 |
|
执行结果
1 | $ sh func_test.sh mark 0 |
接收用户输入参数
1 |
|
执行结果
1 | $ bash func_test.sh |
流程控制
if
1 | # 格式一: |
例
编写shell脚本condition_test.sh
:
1 |
|
执行结果:
1 | [root@VM-0-2-centos ~] sh condition_test.sh |
for
1 | # 格式一: |
例
1 |
|
执行结果
1 | [root@VM-0-2-centos ~] bash condition_test.sh |
指定循环次数
1 |
|
执行结果
1 | [root@VM-0-2-centos ~] bash condition_test.sh |
while
1 | # 只要条件满足,就一直循环 |
例
1 |
|
执行结果
1 | [root@VM-0-2-centos ~] sh condition_test.sh |
until
1 | # 与while处理方式相反,condition 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。 |
例
1 |
|
执行结果
1 | [root@VM-0-2-centos ~]# sh condition_test.sh |
case
1 | # 格式 |
利用case
语句实现计算器
caculator.sh
1 |
|
执行结果
1 | [root@VM-0-2-centos ~] bash caculator.sh 1 + 2 |