是一个命令行解释器,可以接收用户命令来控制电脑,另外也是一种编程语言。shell是本质上是Linux命令,我们将符合shell语法的命令编写的代码被称为shell脚本。
shell有两种解释器:可以在/etc/passwd文件中查询各个用户使用的解释器类型
pstree : 进程关系树
exit:退出当前进程
bash:调用bash
总结一下,我们在终端使用shell命令其实就是在bash解释器里面执行,相当于解释执行与一体了。
#!bin/bash
: 第一行,指定解释器echo "hello\tworld"
bash helloword.sh
或 ./helloworld.sh
PATH = $PATH:脚本的文件路径
helloworld.sh
定义自己的变量时使用小写字母或者驼峰式名法,系统变量全部大写。定义变量的语法:
变量名=变量值
(注意不能有空格)unset 变量名
readonly 变量名
,注意不能unset变量 | 含义 |
---|---|
$n | 代表参数,$0表示脚本自己的名称 |
$# | 代表参数的个数 |
$* | 代表所有参数,当做一个整体 |
$@ | 代表所有参数,不当做一个整体 |
$? | 返回上一个命令的执行状态,如果是0,表示执行成功 |
语法:$((运算表达式))
或 $[运算表达式]
判断方法1:test 1 -eq 1
: 判断1是否等于1
echo $?
:查询比较结果
判断方法2:
[ 1 -eq 1 ]
: 判断1是否等于1,注意中括号两侧必须有空格隔开。[ -r/w/x 文件名 ]
: 判断文件是否有有读/写/执行权限[ -e/f/d 文件名 ]
: 判断文件存在/是否是文件/是否是目录-eq 等于(equal) -ne 不等于(not equal)
-lt 小于(less than) -le 小于等于(less equal)
-gt 大于(greater than) -ge 大于等于(greater equal)
-r 有读的权限(read)
-w 有写的权限(write)
-x 有执行的权限(execute)
-e 文件存在(existence)
-f 文件存在并且是一个常规的文件(file)
-d 文件存在并且是一个目录(directory)
[ 判断表达式 ] 代码1 || 代码2
: 表达式为真执行1,否则执行2if [ 条件判断式 ] then 程序 fi
if [ 条件判断式 ] then 程序1 else 程序2 fi
if [ 条件判断式 ] then
代码1
elif [ 条件判断式 ] then
代码2
else
代码3
fi
1 #!/bin/bash
2
3 if [ $# -ne 1 ]
4 then
5 echo "Parameter number error, msut be 1 parameter"
6 exit
7 fi
8
9 if [ $1 -eq 1 ]
10 then
11 echo "进入第一个分支"
12 elif [ $1 -eq 2 ]
13 then
14 echo "进入第二个分支"
15 else
16 echo "进入了第三个分支"
17 fi
语法格式
case $1 in
"值1")
代码1
;;
"值2")
代码2
;;
*) //表示default
代码
功能:使用switch实现春夏秋冬分支结构
#!/bin/bash
case $1 in
"1")
echo "spring"
;;
"2")
echo "summer"
;;
"3")
echo "autumn"
;;
"4")
echo "winter"
;;
*)
echo "Input error"
;;
esac
单引号是单纯将字符变成字符串,双引号会解析里面的变量。如果有嵌套使用,看最外层的。
格式1:
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
格式2:
for 变量 in 值1 值2 值3…
do
程序
done
功能:用循环统计1-100的和
1 #!/bin/bash
2 sum=0
3 for ((i=0;i<=100;i++))
4 do
5 sum=$[ sum + i ]
6 done
7 echo $sum
功能:用循环打印三句话
#!/bin/bash
for i in $1 $2 $3
do
echo "I like $i"
done
while [ 条件判断式 ]
do
程序
done
功能:计算1-100的和
#!/bin/bash
sum=0
i=1
while [ $i -le 100 ]
do
sum=$[ sum + i ]
i=$[ i + 1 ]
done
echo $sum
read -p ‘please input your name’ -t 10 : 读取控制台字符串输入,打印提示,并等待10秒。
read (选项) (参数)
示例脚本:
#!/bin/bash
read -t 7 -p 'Enter your name in 7 seconds:' name
echo $name
/
分割路径,获取最后一个
basename read.sh .sh
: 删除后缀/
分割,获取前面那部分,即目录路径[ function ] funname[()]
{
Action;
[return int;]
}
//方法定义
#!/bin/bash
fuction sum()
{
echo $[ $1 + $2 ]
}
//方法调用
sum $1 $2
负责剪数据,从文件的每一行剪切字节、字符和字段这些数据。
,
示例代码:获取IP地址
ens33: flags=4163 mtu 1500
inet 192.168.10.102 netmask 255.255.255.0 broadcast 192.168.10.255
inet6 fe80::b2fa:151d:8dd7:e817 prefixlen 64 scopeid 0x20
ether 00:0c:29:a1:0d:83 txqueuelen 1000 (Ethernet)
RX packets 42864 bytes 4930739 (4.7 MiB)
RX errors 0 dropped 1 overruns 0 frame 0
TX packets 16943 bytes 2768715 (2.6 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ifconfig ens33 | grep netmask | cut -d "i" -f 2|cut -d " " -f 2
这里没有直接使用-d " "来进行分割是因为cut命令无法自动丢弃使用空格分隔时产生的""
字符,每两个连续的空格都会产生一个。
是一个文本分析工具,把文件逐行读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。
语法 : awk [选项参数] 'pattern{操作1} pattern{操作2}' filename
awk的内置变量
变量 | 说明 |
---|---|
FILENAME | 文件名 |
NR | 已读的记录数(行号) |
NF | 浏览记录的域的个数(切割后,列的个数) |
代码示例1:获取用户名和bash解释器,通过类似列表的形式打印
awk -v i=1 -F : '{print i " " $1 " " $7}{i=i+1}' passwd
代码示例2: 查找ifconfig中的空行的行号
ifconfig | awt '/^$/{print NR}'
代码示例3: 获取IP地址, awk 会自动丢弃多余的“”
ifconfig | awk '/broadcast/{print $2}'
表达式 | 含义 |
---|---|
^a | 以a开头 |
a$ | 以a结尾 |
. | 任意一个字符 |
* | 不单独使用,表示出现0次或多次 |
.* | 匹配任意字符 |
[ ] | 匹配括号里面的字符 |
[ 0-9] | 匹配任意一个数字 |
[ 0-9]* | 匹配任意长度的数字字符串 |
[ a-z]* | 匹配任意长度的小写字符串 |
a$b | 匹配特殊字符$ |