1、什么是Shell
Shell是一个命令行解释器,是一个黑窗口,当我们在给Linux发出一些命令时,Shell将这些命令翻译成内核可以理解的动作,然后调用内核,操作硬件,操作完成之后,再将信号,翻译成人能理解的形式反馈出来。
Shell还是一个功能强大的编程语言。
从狭义来讲,shell并不是一门语言,它是计算机内核和人沟通的一个桥梁,广义来讲,Shell是一门编程语言。
每一个操作系统都有一个不同的Shell。
2、Shell解释器
Linux提供的Shell解析器有
cat /etc/shells
/bin/sh 是bash的一个软链接(相当于windows的快捷方式)
硬链接:如B是A的硬链接,A指向源文件,访问B会直接访问源文件,不会通过A
当删除源文件,软链接不能够使用,硬链接不受影响
/bin/bash linux默认的解释器
/sbin/nologin 以下可以理解为外语,比如法语,英语,德语等,不太常用
/bin/dash
/bin/tcsh
/bin/csh
3、Shell脚本的helloword
用解释型语言写成的程序称为脚本,是一个命令行的合集,计算机会一行一行进行翻译。
脚本以#!/bin/bash开头,指的是接下来的每一条命令都是bash命令,注意Shell的脚本的注释以#开头但#!/bin/bash不是一行注释,此句表明需要使用的是bash解释器。
touch helloworld.sh
vim helloworld.sh
#!/bin/bash
echo "helloworld"
第一种执行脚本的方式
bash helloworld.sh
linux的文件权限
rw-rw-r-- 1-3为文件的拥有者的权限,4-6为文件拥有组的权限,7-9为其他人的权限
要赋予helloworld.sh 脚本的执行权限
chmod +x helloworld.sh
第二种执行脚本的方式:脚本的自执行
./helloworld.sh
第一种执行方法,本质是bash解析器帮忙执行脚本,所以脚本本身不需要执行权限。第二种执行方法,本质是脚本自己执行,所以需要执行权限。
4、Shell中的变量
所有的Shell变量都是字符串,也就是说在定义变量时,不需要声明类型,等号两侧不能有空格。
a=10
echo $a
b=11
echo $a+$b
a="love you"
撤销变量
unset a
声明静态变量,不可以撤销,不可以修改,一般不用
readonly a=10
在Shell中有一些系统预定义的变量,称为环境变量,可以直接使用。
查看环境变量
env
特殊变量:$n
$n功能描述:n为数字,$0代表该脚本名称,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}
touch parameter.sh
vim parameter.sh
#!/bin/bash
echo $1
echo $2
echo $3
chmod +x parameter.sh
./parameter.sh aaaa bbbb cccc
特殊变量:$#
$#功能描述:获取所有输入参数个数,常用于循环。
vim parameter.sh
#!/bin/bash
echo $#
./parameter.sh a b c d e f g
特殊变量:$*、$@
$* 功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体;
$@功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待
vim parameter.sh
echo $*
echo $@
./parameter.sh a b c d e f g
特殊变量:$?
$?功能描述:显示最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了,用于多个脚本之间的调用。
5、运算符
$((运算式))”或“$[运算式]
echo $S[(2+3)*4]
6、条件判断
[ condition ] condition前后要有空格 或者 test condition
[ $a -eq $b ]
echo $?
判断条件condition
两个整数之间比较
= 字符串比较
-lt 小于(less than) -le 小于等于(less equal)
-eq 等于(equal) -gt 大于(greater than)
-ge 大于等于(greater equal) -ne 不等于(Not equal)
按照文件权限进行判断
-r 有读的权限(read) -w 有写的权限(write)
-x 有执行的权限(execute)
按照文件类型进行判断
-f 文件存在并且是一个常规的文件(file)
-e 文件存在(existence) -d 文件存在并是一个目录(directory)
查看test全部功能
man test
7、流程控制
if判断:如果第一个参数是1输出a,2输出b,其他输出3。其中test可以用[ ]代替
if test $1 = 1
then
echo a
elif test $1 = 2
then
echo b
else
echo c
fi
case语句:如果第一个参数是1输出a,2输出b,其他输出3。
case $1 in
"1")
echo a
;;
"2")
echo b
;;
*)
echo c
;;
esac
for循环:从1加到100
#!/bin/bash
sum=0
for ((i=1;i<=100;i++))
do
sum=$[$sum+$i]
done
echo $sum
增强for
for i in a b c
do
echo $i
done
while循环:从1加到100
#!/bin/bash
sum=0
i=1
while [ $i -le 100 ]
do
sum=$[$sum+$i]
i=$[$i+1]
done
echo $sum
8、读取控制台输入
read(选项)(参数) 作用:read通过控台输入给一个变量赋值,提供了一个参数以外的人和程序交互的方式,叫做控制台输入。
#!/bin/bash
read i
echo $i
添加-p参数可以让控制台打印一些提示信息
#!/bin/bash
read -p "input something" i
echo $i
-t参数,在十秒以内输完
#!/bin/bash
read -p "input something in 10s" -t 10 i
echo $i
9、函数
基本语法,[]内的内容可以省略
[ function ] funname[()]
{
Action;
[return int;]
}
funname
自定义一个函数aaa,其中有两个参数
function aaa
{
i=$[$1+$2]
echo $1
return $1
}
之后aaa 4 5 就可以调用,4 5 为参数,返回值返回的是一个状态码,0表示正确,其他表示错误。
系统函数
basename 路径名称:功能描述,basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。
dirname 文件绝对路径:功能描述,从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))
10、Shell工具
四个流处理工具
cut
cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。
cut [选项参数] filename
选项参数 功能
-f 列号,提取第几列
-d 分隔符,按照指定分隔符分割列
-c 指定具体的字符
剪出虚拟机的IP地址
ifconfig | grep Bcast | cut -d : -f 2 | cut -d " " -f 1
取出第20个和第30个字符
ifconfig | grep Bcast | cut -c 20,30
取出第20到30个字符
ifconfig | grep Bcast | cut -c 20-30
sed
sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非使用重定向存储输出。
sed [选项参数] ‘command’ filename
选项参数 功能
-e 直接在指令列模式上进行sed的动作编辑。
-i 直接编辑文件
命令 功能描述
a 新增,a的后面可以接字串,在下一行出现
d 删除 '2d' 删除第二行
s 查找并替换 '2s/替换的字符/替换的内容/'
将第二行的inet替换成aaaa
ifconig | sed '2s/inet/aaaa/'
删除第二行到第五行
ifconfig | sed '2,5d'
将第二行和第五行的0变为X,不加g只会更改第二行和第五行的第一个0,当有多个命令,需要加-e
ifconfig | sed -e '2s/0/X/g' -e '5s/0/X/g';
将inet afddr 更改为ip addr
ifconfig | sed 's/inet addr/ip addr/'
正则表达式:通过一段非常扭曲的字符来匹配一段字符串。
替换表达式内部直至正则表达式
ifconfig | sed 's/inet[6]* addr/ip address/'
正则表达式的六个规则
\ 转义
^ 一行的开头
^R------表示以R开头的行
$ 匹配一行的结束
R$表示以R结尾的行
* 表示上一个子式匹配0次或多次,是一个贪心匹配
Zo*-----表示Z开头后面跟着若干个o,以下三个字符串都可以匹配到
Z
Zo
Zooo
. 匹配一个任意的字符
.*匹配任意字符串
[] 表示匹配某个范围内的一个字符
[6,8]------匹配6或者8
[a-z]------匹配一个a-z之间的字符
[a-z]*-----匹配任意字母字符串
将数字6保存下来,使用()再在后面调用即可,可以保存9个子式,使用\1-9完成调用。
ifconfig | sed 's/inet\([6]*\) addr/ip\1 address/'
范围表达也可以使用正则表达式,使用两个\把范围括起来。
将以R开头到T开头行的0替换成X。
ifconfig | sed '/^ *R/,/^ *T/s/0/X/g'
每一个shell环境都是一个进程,并且shell可以启动很多个,各个shell环境之间是独立的
执行脚本时,是在子环境中执行的,而不是在当前环境中执行的。
使用source完成当前环境执行一个脚本:
source a.sh
awk
一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。
awk [选项参数] ‘pattern1{action1} pattern2{action2}...’ filename
pattern:表示AWK在数据中查找的内容,就是匹配模式
action:在找到匹配内容时所执行的一系列命令
选项参数 功能
-F 指定输入文件折分隔符
-v 赋值一个用户定义变量
将以r开头的行打印出来
cp /etc/passwd ./
cat passwd | awk '/^r/{print}'
用-F指定切割规则,以:为规则切割
cat passwd | awk -F : '/^r/{print $4}'
awk内置变量
变量 说明
FILENAME 文件名
NR 已读的记录数
NF 浏览记录的域的个数(切割后,列的个数)
查看awk使用手册
man awk
sort
sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。
sort(选项)(参数)
选项 说明
-n 依照数值的大小排序
-r 以相反的顺序来排序
-t 设置排序时所用的分隔字符
-k 指定需要排序的列
cat passwd | awk -F : '/^a/{print}' | sort -t : -k 3 -n -r