Shell 是 Unix 系统下的一个命令解释器,主要用于系统和用户的交互。在 Unix 上有各种不同版本的 Shell,Bash是Linux标准默认的Shell,它是BourneAgain Shell的缩写。我们这里主要讨论的也是 Bash。
Linux常用命令表 ( 约60个常用命令)|
分类 | 命令 |
---|---|
文件相关 | cd , whereis , pwd , ls , file , echo , mkdir/rmdir , cat/more , cp/mv/rm , chowm/chgrp , chmod , grep , find , locate , ln , gzip , tar , diff , patch |
磁盘管理 | df , du , mount/umount , fdisk , mkfs |
用户管理 | useradd , userdel , usermod , groupadd , groupdel , groupmod , groups , passwd , id , who , whoami |
系统及相关 | su , sudo , export , shutdown , poweroff ,halt , reboot , ps , top , uname , uptime , clear , cal , date/time |
网络配置 | netstat , nslookup , finger , ping , ifconfig , ftp , telnet , ssh |
Shell 编程
Shell 脚本(shell script),是一种为shell编写的脚本程序。
简单的几点 shell 语法:
#!
指定sh解释程序#;
注释- 关于空格,
=
不加空格, 运算符要加空格。
Shell 变量
用户自定义变量
变量类型只支持字符串,不支持整形,字符,浮点;
- 等号前后不要有空格
- 一般变量命名用全大写
unset
命令删除变量赋值readonly
标定只读变量export
来指定global变量
预定义变量
$0
与键入的命令行一样,包含脚本文件名$1, $2,...$9
分别包含第一个到第九个命令行参数$#
命令行参数的个数$@
所有命令行参数$?
前一个命令的退出状态$*
所有命令行参数$$
正在执行的进程ID号
环境变量
HOME
: 当前用户的主目录PATH
: shell搜索路径TERM
: 终端程序名称UID
: 当前用户的识别字,取值是由数位构成的字串。PWD
: 当前工作目录的绝对路径名,该变量的取值随cd命令的使用而变化。PS1
: 主提示符,在特权用户下,默认的主提示符是#,在普通用户下,默认的主提示符是$。# , $PS2
: 在Shell接收用户输入命令的过程中,如果用户在输入行的末尾输入“\”然后回车,或者当用户按回车键时Shell判断出用户输入的命令没有结束时,就显示这个辅助提示符,提示用户继续输入命令的其余部分,默认的辅助提示符是>
字符串
字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。
单引号
1str='this is a string'单引号字符串的限制:
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。
双引号
12your_name='qinjx'str="Hello, I know your are \"$your_name\"! \n"双引号的优点:
- 双引号里可以有变量
- 双引号里可以出现转义字符
拼接字符串
1234your_name="qinjx"greeting="hello, "$your_name" !"greeting_1="hello, ${your_name} !"echo $greeting $greeting_1获取字符串长度
12string="abcd"echo ${#string} #输出 4提取子字符串
以下实例从字符串第2
个字符开始截取4
个字符:12string="runoob is a great site"echo ${string:1:4} # 输出 unoo查找子字符串
查找字符i
或s
的位置:12string="runoob is a great company"echo `expr index "$string" is` # 输出 8注意: 以上脚本中 ` 是反引号,而不是单引号,不要看错了哦。
Shell 数组
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
类似与C语言,数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。
定义数组
在Shell中,用括号来表示数组,数组元素用”空格”符号分割开。定义数组的一般形式为:数组名=(值1 值2 ... 值n)
例如:1array_name=(value0 value1 value2 value3)或者
123456array_name=(value0value1value2value3)还可以单独定义数组的各个分量:
123array_name[0]=value0array_name[1]=value1array_name[n]=valuen可以不使用连续的下标,而且下标的范围没有限制。
读取数组
读取数组元素值的一般格式是:${数组名[下标]}
例如:valuen=${array_name[n]}
使用@符号可以获取数组中的所有元素,例如:echo ${array_name[@]}
获取数组的长度
获取数组长度的方法与获取字符串长度的方法相同,例如:123456# 取得数组元素的个数length=${#array_name[@]}# 或者length=${#array_name[*]}# 取得数组单个元素的长度lengthn=${#array_name[n]}
Shell 语句
基本运算符
Shell 和其他编程语言一样,支持多种运算符,原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
例如,两个数相加(注意使用的是反引号 ` 而不是单引号 ‘):
执行脚本,输出结果如下所示:
两数之和为 : 4
注意:
- 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
- 完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边。
- 乘号(*)前边必须加反斜杠(\)才能实现乘法运算.
常用的运算符如下:
运算符 | 说明 | 举例 |
---|---|---|
+ | 加法 | 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。 |
-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。 |
! | 非运算,表达式为 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。 |
&& | 逻辑的 AND | [[ $a -lt 100 && $b -gt 100 ]] 返回 false |
II | 逻辑的 OR | [[ $a -lt 100 II $b -gt 100 ]] 返回 true |
= | 检测两个字符串是否相等,相等返回 true。 | [ $a = $b ] 返回 false。 |
!= | 检测两个字符串是否相等,不相等返回 true。 | [ $a != $b ] 返回 true。 |
-z | 检测字符串长度是否为0,为0返回 true。 | [ -z $a ] 返回 false。 |
-n | 检测字符串长度是否为0,不为0返回 true。 | [ -n $a ] 返回 true。 |
str | 检测字符串是否为空,不为空返回 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。 |
shell 内部命令
echo
输出exec
exit
退出read
从标准输入读取一行并且赋值给后面变量12read varread var1 var2 var3expr
常见的算术运算+ , - , \* , / , %
注意,运算符左右两边都需要有空格,否则会视为字符串连接test
测试结果也常常用来作为判断条件及结果123test "$answer" = "yes"test $num -eq 18test -d temp可以用[]代替test , 但需要左右留有一个空格 ,比如
12[ "$answer" = "yes" ]if [ $num -eq 18 ]
结构性语句
条件
if
语句1234if...then...fiif [exp]then [command]fiif else
语句1234if [exp]then [command]else [command]ifcase...esac
语句123456789101112case [var] in[param1])[command];;[param2])[command];;[paramn])[command】;;esac注意:var只能是字符串型变量
循环
for…do…done
1234for [var] in [list]do[command]donewhile…do…done
1234while [exp]do[command]doneuntil…do…done
1234until [exp]do[command]donebreak, continue
Shell 函数
定义格式
12345678910111213function_name(){command1...commandn}function function_name(){command1...commandn}说明:
- 1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
- 2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255
调用函数
12345[var]=`function_name [arg1,arg2...]`do(fdf,dfdfd)do fdf fdfddfunction_name [arg1,arg2...]echo $?说明:
- 函数返回值在调用该函数后通过 $? 来获得。
- 所有函数在使用前必须定义。调用函数仅使用其函数名即可。
- 调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,当n>=10时,需要使用${n}来获取参数。
Shell 文件包含
Shell 文件包含的语法格式如下: