Shell解析器
Linux的Shell解析器有
[yyx@hadoop04 ~]$ cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
CentOS默认的解析器为bash
创建一个脚本实例
要求:输出HelloWord
- 首先,创建一个.sh文件
touch helloword.sh
- 其次,vim编辑文件内容
#!/bin/bash
echo "hello word"
#!/bin/bash 是指定解析器
- 运行
sh helloword.sh
脚本的执行方式
第一种
- sh+脚本相对路径
- sh+脚本绝对路径
- bash+脚本相对路径
- bash+脚本绝对路径
第二种
首先要修改脚本文件权限
chmod 777 helloword.sh
之后运行:
./hellowold.sh
绝对路径同理
注意:第一种执行方法,本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限。第二种执行方法,本质是脚本需要自己执行,所以需要执行权限。
创建另一个脚本文件
创建一个文件夹cls,在cls文件夹中创建一个txt文件并且在文件中写入I Love You
创建脚本文件并编写:
[yyx@hadoop04 ~]$ touch ILoveYou.sh
[yyx@hadoop04 ~]$ vim ILoveYou.sh
#!/bin/bash
mkdir cls
cd cls
touch ILoveYou.txt
echo "I Love You" >> ILoveYou.txt
运行:
[yyx@hadoop04 ~]$ sh ILoveYou.sh
Shell中的变量
系统变量
常用系统变量
$HOME、$PWD、$SHELL、$USER
等
查看系统变量:
[yyx@hadoop04 ~]$ echo $HOME
/home/yyx
自定义变量
基本语法:
定义变量:变量=值
撤销变量:unset 变量
声明静态变量:readonly变量,注意:不能unset
创建变量规则:
1.变量名可以由字母、数字、下划线组成,但是不能以数字开头,环境变量名建议大写
2.等号两侧没有空格
3.在bash中,变量默认类型都是字符串类型,无法进行数值运算
4.变量的值如果有空格,需要双引号或者单引号括起来
实操
1.定义变量A
[yyx@hadoop04 ~]$ A=5
[yyx@hadoop04 ~]$ echo $A
5
2.给A重新赋值
[yyx@hadoop04 ~]$ A=8
[yyx@hadoop04 ~]$ echo $A
8
3.撤销变量
[yyx@hadoop04 ~]$ unset A
[yyx@hadoop04 ~]$ echo $A
4.创建静态变量B,不能unset
[yyx@hadoop04 ~]$ readonly B=6
[yyx@hadoop04 ~]$ echo $B
6
[yyx@hadoop04 ~]$ unset B
-bash: unset: B: 无法反设定: 只读 variable
5.无法运算:
[yyx@hadoop04 ~]$ A=7
[yyx@hadoop04 ~]$ echo $A+$B
7+6
运算
基本语法
$((运算式))或$[运算式]
实操:
[yyx@hadoop04 ~]$ echo $A+$B
7+6
[yyx@hadoop04 ~]$ echo $[A+B]
13
2.expr + , - , *, /, % 加,减,乘,除,取余
注意:expr运算符间要有空格,尽量不要用
实操:
[yyx@hadoop04 ~]$ expr $A + $B
13
特殊变量
特殊变量:$n
基本语法
$n
功能描述:n为数字,$0代表该脚本名称,$1~$9表示第一到第九个参数,** 十以上的参数需要用大括号包含 **
${11}
实操:
#!/bin/bash
echo $1 $2 $3
[yyx@hadoop04 ~]$ sh aaa.sh aaa bbb ccc ddd
aaa bbb ccc
特殊变量:$#
基本语法
$# :获取所有输入参数个数,常用于循环
实操:
#!/bin/bash
echo $1 $2 $3
echo '$#'=$#
~
[yyx@hadoop04 ~]$ sh aaa.sh aaa b c d
aaa b c
$#=4
[yyx@hadoop04 ~]$
特殊变量:$* $@
基本语法:
$*:这个变量代表命令行中所有的参数, $ *把所有参数看成一个整体
$@:这个变量也代表命令行中所有参数,不过 $@把每个参数区分对待
实操:
#!/bin/bash
echo $1 $2 $3
echo '$#'=$#
echo '$*'=$*
echo '$@'=$@
[yyx@hadoop04 ~]$ sh aaa.sh aaa b c d
aaa b c
$#=4
$*=aaa b c d
$@=aaa b c d
特殊变量:$?
基本语法
$?:最后一次执行命令的返回状态,如果这个变量值为0,证明上一个命令正确执行,如果这个变量的值非0,证明上一个命令执行有误。
实操:
[yyx@hadoop04 ~]$ sh aaa.sh aaa b c d
aaa b c
$#=4
$*=aaa b c d
$@=aaa b c d
[yyx@hadoop04 ~]$ echo $?
0
条件判断
基本语法:
【condition】(注意:condition前后要空格)
常用的判断条件
1.两个整数之间比较
=:字符串比较
-lt :小于
-eq:等于
-ge:大于等于
-le:小于等于
-gt:大于
-ne:不等于
实操:
[yyx@hadoop04 ~]$ A=4
[yyx@hadoop04 ~]$ B=5
[yyx@hadoop04 ~]$ [ $A = $B ]
[yyx@hadoop04 ~]$ echo $?
1
[yyx@hadoop04 ~]$
只能通过这种方式判断,注意空格
按照文件权限进行判断
-r:有读的权限
-w:有写的权限
-x:有执行的权限
实操:
[yyx@hadoop04 ~]$ [ -x aaa.sh ]
[yyx@hadoop04 ~]$ echo $?
1
证明没有执行权限
按照文件类型判断
-f:文件存在并且是一个常规文件
-e:文件存在
-d:文件存在并且是一个目录
[yyx@hadoop04 ~]$ [ -f aaa.sh ]
[yyx@hadoop04 ~]$ echo $?
0
[yyx@hadoop04 ~]$ [ -d aaa.sh ]
[yyx@hadoop04 ~]$ echo $?
1
流程控制
if判断:
语法:
if [ 条件判断语句 ]
then
程序。。。
elif [ 条件判断 ]
then
程序。。。
else
程序
fi
注意:if后要有空格
实操:
查看是否存在一个叫b的文件,如果存在,输出文件内容,否则新建一个b文件,并且打印bbbb在其中
vim bbbb.sh
#!/bin/bash
if [ -e b.txt ]
then
cat b.txt
else
touch b.txt
echo 'bbbb' >> b.txt
fi
case语句
基本语法
case $变量名 in
“值1”)
程序1
;;
“值2”)
程序2
;;
*)
如果变量不是上面的值,执行此程序
;;
esac
实操:
#!/bin/bash
#如果一个参数是1,我们打印1,如果参数是2,我们打印2,否则打印3
case $1 in
"1")
echo '1'
;;
"2")
echo '2'
;;
*)
echo '3'
;;
esac
[yyx@hadoop04 ~]$ sh testcase.sh
3
[yyx@hadoop04 ~]$ sh testcase.sh 1
1
[yyx@hadoop04 ~]$ sh testcase.sh 1 2
1
[yyx@hadoop04 ~]$ sh testcase.sh 2
2
注意:case行尾必须为单词in,每一个模式匹配都必须以)结束
双分号;;表示命令序列结束,相当于java中的break
最后的*表示默认模式,相当与java中的default
for循环
基本语法1
for((初始值;循环控制条件;变量变化))
do
程序
done
实操:
从1加到100
[yyx@hadoop04 ~]$ vim for1.sh
#!/bin/bash
s=0
for((i=0;i<=100;i++))
do
s=$[ $s + $i ]
done
echo $s
[yyx@hadoop04 ~]$ sh for1.sh
5050
基本语法2
for 变量 in 值1 值2 值3.....
do
程序
done
实操:
#!/bin/bash
for i in "$*"
do
echo $i
done
for i in "$@"
do
echo $i
done
[yyx@hadoop04 ~]$ sh for2.sh aaa bbb ccc ddd
aaa bbb ccc ddd
aaa
bbb
ccc
ddd
while循环
基本语法
while [条件判断式]
do
程序
done
实操:
[yyx@hadoop04 ~]$ vim while.sh
#!/bin/bash
#用while循环输出1到100的和
i=1
s=0
while [ $i -le 100 ]
do
s=$[ $s+$i ]
i=$[ $i+1 ]
done
echo $s
[yyx@hadoop04 ~]$ sh while.sh
5050
read控制台输入
[yyx@hadoop04 ~]$ vim testread.sh
#!/bin/bash
read i
echo $i
[yyx@hadoop04 ~]$ sh testread.sh
aaa
aaa
太单调,放一些提示信息
[yyx@hadoop04 ~]$ vim testread.sh
#!/bin/bash
read -p "请输入变量" i
echo $i
[yyx@hadoop04 ~]$ sh testread.sh
请输入变量 aaa
aaa
设置时间限制:
[yyx@hadoop04 ~]$ vim testread.sh
#!/bin/bash
read -p "请五秒内输入变量" -t 5 i
echo $i
函数
系统函数
自定义函数
基本语法
[ function ] funname[()]
{
Action
[return int;]
}
funname #表示调用函数
注意:
必须在调用函数之前声明函数,shell是逐行执行语言,不会向其他语言一样先编译
函数返回函数值,只能通过$?变量来获得,return返回的是函数执行成功或失败的状态码,而不是结果。return后加数值(0-255)
参数并不是放在()中
实操:
[yyx@hadoop04 ~]$ vim functionAaa.sh
#!/bin/bash
function aaa(){
echo aaa
}
aaa
[yyx@hadoop04 ~]$ sh functionAaa.sh
aaa
Shell工具(工具)
cut
cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。
基本语法
cut 【参数】 filename
实操:
[yyx@hadoop04 ~]$ ifconfig ens33 | grep "inet " | cut -d" " -f10
192.168.111.114
注意空格,很重要
sed
sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
基本语法
sed [选项参数] ‘command’ filename
命令功能描述
正则表达式(简要)
实操:
创建set文件并插入数据
[yyx@hadoop04 ~]$ vim set.txt
aaaaaaaaaaa
bbbbbbbbbbbbbb
cccccccccccccccccc
woxiangmonidetoufazhishijiandandeshitana
woxianggeinigeyongbaoxiangpengyouyiyangkeyima
nituibanbudedongzuorenzhendema
xiaoxiaodedongzuoshanghaihainameda
wozhixiangbanyangeshenshi
cainenghenishuoshuohua
1.将duanduan插入第二行并打印
[yyx@hadoop04 ~]$ sed '2 a duanduan' set.txt
aaaaaaaaaaa
bbbbbbbbbbbbbb
duanduan
cccccccccccccccccc
woxiangmonidetoufazhishijiandandeshitana
woxianggeinigeyongbaoxiangpengyouyiyangkeyima
nituibanbudedongzuorenzhendema
xiaoxiaodedongzuoshanghaihainameda
wozhixiangbanyangeshenshi
cainenghenishuoshuohua
未 -i 文件不改变
2.删除所有包含z的行
//中表示正则表达式
[yyx@hadoop04 ~]$ sed '/z/ d' set.txt
aaaaaaaaaaa
bbbbbbbbbbbbbb
cccccccccccccccccc
woxianggeinigeyongbaoxiangpengyouyiyangkeyima
cainenghenishuoshuohua
3.将文件中所有z换成y
g表示全部替换
[yyx@hadoop04 ~]$ sed 's/z/y/g' set.txt
aaaaaaaaaaa
bbbbbbbbbbbbbb
cccccccccccccccccc
woxiangmonidetoufayhishijiandandeshitana
woxianggeinigeyongbaoxiangpengyouyiyangkeyima
nituibanbudedongyuorenyhendema
xiaoxiaodedongyuoshanghaihainameda
woyhixiangbanyangeshenshi
cainenghenishuoshuohua
awk
一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。
基本语法
awk [选项参数] ‘pattern1{action1} pattern2{action2}…’ filename
pattern:表示AWK在数据中查找的内容,就是匹配模式
action:在找到匹配内容时所执行的一系列命令
实操,还是以刚刚的set.txt练习
1.搜索以wo开头的所有行,并且按i分割,输出第七列
[yyx@hadoop04 ~]$ awk -F i '/^wo/{print $7}' set.txt
tana
ma
2.搜索所有以wo开头的行,并按i分割,输出第2列和第5列
[yyx@hadoop04 ~]$ awk -F i '/^wo/{print $7,$5}' set.txt
tana j
ma angpengyouy
awk内置变量
sort
排序
基本语法
sort(选项)(参数)
参数:指定待排序的文件列表
默认按照字符串按位比较