Shell入门

一、Shell概述

为什么要学习Shell?

  1. 需要看懂运维人员编写的Shell程序。
  2. 偶尔会编写一些简单Shell程序来管理集群、提高开发效率。
    shell是一个命令行解释器,接收应用程序/用户的指令,调度操作系统内核,shell还是一个功能强大的编程语言,易编写,易调试,灵活性强。

二、shell解析器

  1. Linux提供的Shell解析器有:
#查看命令
cat /etc/shells
#结果
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
  1. bash和sh的关系
查看关系
[root@hadoop03 bin]# ll |grep bash
-rwxr-xr-x. 1 root root    964608 Oct 31  2018 bash
lrwxrwxrwx. 1 root root         4 Jul 11  2019 sh -> bash
 - sh是bash的软链(符号链接)
 - 在一般的linux系统当中(如redhat),使用sh调用执行脚本相当于打开了bash的POSIX标准模式
 - 也就是说 /bin/sh   相当于 /bin/bash --posix
  1. Centos默认的解析器是bash
[root@hadoop03 bin]# echo $SHELL
/bin/bash

三、Shell脚本入门

  1. 脚本格式
    脚本以#!/bin/bash开头(指定解析器)
    2.第一个Shell脚本 helloworld
[root@hadoop03 shell01]# vim helloworld.sh
#!/bin/bash
echo "helloworld"

1)脚本执行方式

#第一种采用bash或sh+脚本的相对路径或者绝对路径制行
#不用赋予脚本+X权限
#相对路径
[root@hadoop03 shell01]# sh helloworld.sh 
helloworld
[root@hadoop03 shell01]# bash helloworld.sh 
helloworld
#绝对路径
[root@hadoop03 shell01]# sh /opt/shell01/helloworld.sh 
helloworld
[root@hadoop03 shell01]# bash /opt/shell01/helloworld.sh 
helloworld

#第二种采用输入脚本相对路径或绝对路径执行脚本
#必须赋予可执行权限+x
#赋予helloworld.sh脚本的+x权限
#相对路径
[root@hadoop03 shell01]# ./helloworld.sh 
helloworld
#绝对路径
[root@hadoop03 shell01]# /opt/shell01/helloworld.sh 
helloworld
第一种执行方法,本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限。第二种执行方法,本质是脚本需要自己执行,所以需要执行权限。

3.多命令处理脚本

[root@hadoop03 shell01]# touch batch.sh
[root@hadoop03 shell01]# vim batch.sh 
#!/bin/bash

cd /opt/shell01		#进入/home/shell01目录
touch swk.txt		#创建swk.txt文件
echo "孙悟空" >>swk.txt	#当swk.txt文件不存在时会默认创建swk.txt文件,并且在文件末尾追加孙悟空三个字
shell脚本是自上而下执行的,类似于一条条语句

四、Shell中的变量

一、系统变量

1.常用系统变量

H O M E 、 HOME、 HOMEPWD、 S H E L L 、 SHELL、 SHELLUSER等

#查看系统变量的值
[root@hadoop03 shell01]# echo $HOME	 	#查看 home是用户地主目录
/root
[root@hadoop03 shell01]# echo $PWD		#目录的全路径名称
/opt/shell01
[root@hadoop03 shell01]# echo $SHELL	#显示环境变量$SHELL的值 SHELL 使用哪一种
/bin/bash
[root@hadoop03 shell01]# echo $USER		#显示当前用户
root

二、自定义变量

1.基本语法
1)定义变量:变量=值
2)撤销变量:unset 变量
3)声明静态变量:readonly变量,注意:不能unset
2.变量定义规则
1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
2)等号两侧不能有空格
3)在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
4)变量的值如果有空格,需要使用双引号或单引号括起来。

#给a赋值
[root@hadoop03 home]# a=5
[root@hadoop03 home]# echo $a
5
[root@hadoop03 home]# echo $A 	#变量区分大小写
#重新赋值a
[root@hadoop03 home]# a=8
[root@hadoop03 home]# echo $a
8
#撤销变量a
[root@hadoop03 home]# unset a
[root@hadoop03 home]# echo $a
#声明静态变量b=2,不能使用unset
[root@hadoop03 home]# b=9
bash: b: readonly variable
[root@hadoop03 home]# unset b
bash: unset: b: cannot unset: readonly variable
#在bash中,变量默认是字符串类型,无法直接进行数值运算
[root@hadoop03 home]# c=1+2
[root@hadoop03 home]# echo $c
1+2
#变量的值如果有空格,则需要使用单/双引号括起来
[root@hadoop03 home]# d=hello world
bash: world: command not found
[root@hadoop03 home]# d="hello world"
[root@hadoop03 home]# echo $d
hello world
#可以把变量设置为全局变量,可以提供shell程序使用
#export 变量名
[root@hadoop03 shell01]# vim helloworld.sh
#!/bin/bash
echo "helloworld"
echo $b
[root@hadoop03 shell01]# ./helloworld.sh 
helloworld	#b的值没有出现
[root@hadoop03 shell01]# export b
[root@hadoop03 shell01]# ./helloworld.sh 
helloworld
2	#打印出b的值

三、特殊变量

1)$n

n为数字,$0代表该脚本名称、 $1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}

[root@hadoop03 shell01]# touch parameter.sh
[root@hadoop03 shell01]# vim parameter.sh 
#!/bin/bash
echo "$0  $1   $2"
[root@hadoop03 shell01]# chmod 777 parameter.sh
[root@hadoop03 shell01]# ./parameter.sh cls  xz
./parameter.sh cls xz

2)$#

获取所有输入参数个数,常用于循环

[root@hadoop03 shell01]# vim parameter.sh 
#!/bin/bash
echo "$0  $1   $2"	#输出脚本名称,参数
echo $#				#获取输入参数个数
[root@hadoop03 shell01]# ./parameter.sh cls  xz
./parameter.sh cls xz
2

3)$*、$@

$* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
$@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)

[root@hadoop03 shell01]# vim parameter.sh 
#!/bin/bash
echo "$0 $1 $2"
echo $#
echo $*
echo $@
[root@hadoop03 shell01]# bash parameter.sh 1 2 3
parameter.sh  1   2
3
1 2 3
1 2 3

4)$?

$ ? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(由命令自己来决定具体是哪个数),则证明上一个命令执行不正确。)

[root@hadoop03 shell01]# ./helloworld.sh 
helloworld
[root@hadoop03 shell01]# echo $?
0

五、运算符

1.基本语法
1)expr X + , - , *, /, % X
2)$[运算式]

expr运算符间要有空格,

#计算3+2的值
[root@hadoop03 shell01]# expr 2 + 3
5
#计算3-2的值
[root@hadoop03 shell01]# expr 3 - 2
1
#计算(2+3)X4的值
#expr一步完成计算
[root@hadoop03 shell01]# expr `expr 2 + 3` \* 4
20
#采用$[运算式]方式
[root@hadoop03 shell01]# s=$[(2+3)*4]
[root@hadoop03 shell01]# echo $s
20

六、条件判断

1.基本语法

[ X 判断条件 X ]

condition前后要有空格,条件非空即为true

2.常用判断条件

(1)整数间比较

-lt 小于(less than)
-le 小于等于(lessequal)
-eq 等于(equal)
-gt 大于(greater than)
-ge 大于等于(gerater equal)
-ne不等于(Not equal)

(2)文件权限判断

-r 有读的权限(read)
-w 有写的权限(write)
-x 有执行的权限(execute)

(3)文件类型判断

-f 文件存在并且是一个常规的文件(file)
-e 文件存在(existence)
-d 文件存在并且是一个目录

(4)代码

#23是否大于等于22
[root@hadoop03 shell01]# [ 23 -ge 22  ]
[root@hadoop03 shell01]# echo $?
0
#22是否大于等于23
[root@hadoop03 shell01]# [ 22 -ge 23  ]
[root@hadoop03 shell01]# echo $?
1
#helloworld.sh是否具有写权限
[root@hadoop03 shell01]# [ -w helloworld.sh ]
[root@hadoop03 shell01]# echo $?
0
#当前目录中的文件是否存在
[root@hadoop03 shell01]# [ -e ./sss.sh ]
[root@hadoop03 shell01]# echo $?
1

七、流程控制

1.if判断

1.基本语法

if [ 条件判断式 ];then
	程序体
fi
或者
if [ 条件判断式 ]
	then
		程序体
fi

[ 条件判断式 ] 中括号和条件判断式之间必须有空格
if后要有空格

2.代码

[root@hadoop03 shell01]# vim iftest.sh 

#!/bin/bash
if [ $1 -eq "1" ]
        then
                echo "输入是1!!!"
fi
[root@hadoop03 shell01]# ./iftest.sh 1
输入是1!!!
[root@hadoop03 shell01]# vim iftest.sh
#!/bin/bash
if [ $1 -eq "1" ]
        then
                echo "输入是1!!!"
elif [ $1 -eq "2" ]
        then
                echo "输入是2!!!"
fi
[root@hadoop03 shell01]# ./iftest.sh 1
输入是1!!!
[root@hadoop03 shell01]# ./iftest.sh 2
输入是2!!!

2.case判断

1.基本语法

case $变量名 in
	"值1")
	如果变量的值等于值1则执行该程序1
	;;
	"值2")
	如果变量的值等于值2则执行该程序2
	;;
	*)
	如果变量的值不属于以上任意一个,则执行该段程序
	;;
esac

case行尾必须为单词in,每一个模式匹配必须以右括号)结尾。
双分号;;表示命令序列结束,相当于Java的break。
最后的*)表示默认语句,相当于Java的default。

2.代码展示

[root@hadoop03 shell01]# ./case.sh 
既不是1也不是2
[root@hadoop03 shell01]# ./case.sh 1
输入的是1!!!
[root@hadoop03 shell01]# ./case.sh 2
输入的是2!!!

3.for循环

1.基本语法

for (( 初始值;循环控制条件;变量变化 ))
	do
		程序
donefor 变量 in 值1 值2 值3
	do
		程序
done

2.代码展示

[root@hadoop03 shell01]# vim for1.sh
#!/bin/bash
s=0
for (( i=0;i<=100;i++ ))
        do
                s=$[ $s+$i ]
done
echo $s
[root@hadoop03 shell01]# chmod 777 for1.sh
[root@hadoop03 shell01]# ./for1.sh
5050
#打印输出参数
[root@hadoop03 shell01]# touch for2.sh
[root@hadoop03 shell01]# vim for.sh
#!/bin/bash
#打印输入参数
for i in $*
        do
                echo "您输入的是$i"
done
[root@hadoop03 shell01]# bash for.sh asd sada  sada 1231
您输入的是asd
您输入的是sada
您输入的是sada
您输入的是1231
#比较$*和$@区别
[root@hadoop03 shell01]# vim for.sh
#!/bin/bash
for i in $*
do
        echo "您输入的是$i"
done

for j in $@
do
        echo "您输入的是$j"
done
[root@hadoop03 shell01]# bash for.sh 123 4456 789
您输入的是123
您输入的是4456
您输入的是789
您输入的是123
您输入的是4456
您输入的是789
[root@hadoop03 shell01]# vim for.sh
#!/bin/bash 
for i in "$*" 
#$*中的所有参数看成是一个整体,所以这个for循环只会循环一次 
        do 
                echo "ban zhang love $i"
done 
for j in "$@" 
#$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次 
        do 
                echo "ban zhang love $j" 
done

4.while循环

1.基本语法

while [ 条件判断式 ]
	do
		程序
done

2.代码展示

#从1加到100
[root@hadoop03 shell01]# vim while.sh
#!/bin/bash
s=0
i=1
while [ $i -le 100 ]
        do
                s=$[ $s+$i ]
                i=$[ $i+1 ]
done
echo $s

[root@hadoop03 shell01]# chmod 777 while.sh 
[root@hadoop03 shell01]# ./while.sh 
5050

八、read读取控制台输入

1.基本语法

read(选项)(参数)
选项:
-p:指定读取值时的提示符
-t:指定读取值时等待的时间(秒)
参数
变量:指定读取值时的变量名

2.代码展示

[root@hadoop03 shell01]# vim read.sh
#!/bin/bash
read -t 7 -p "请在7秒内输入您的名字" NAME
echo $NAME
[root@hadoop03 shell01]# chmod 777 read.sh 
[root@hadoop03 shell01]# ./read.sh
请在7秒内输入您的名字name
name

9、函数

1.系统函数

1.basename基本语法

basename [string / pathname][suffix] (功能描述:basename命令会删掉所有的前缀包括最后一个/,然后将字符串显示出来)。
suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉

2.代码展示

#截取路径的文件名称
[root@hadoop03 shell01]# basename /opt/shell01/while.sh 
while.sh
#截取路径的文件名称不包括后缀
[root@hadoop03 shell01]# basename /opt/shell01/while.sh .sh
while

3.dirname基本语法

dirname 文件绝对路径 (功能描述:从给的包含绝对路径的文件名中去除非目录部分的文件名,然后返回剩下的目录部分的路径)

4.代码展示
#获取while.sh文件的路径,不包括非目录的文件
[root@hadoop03 shell01]# dirname /opt/shell01/while.sh 
/opt/shell01

2.自定义函数

1.基本语法

[ function ] funname[()]
{
Action;
[return int;]
}
funname

必须在调用函数前先声明函数,因为Shell脚本时逐行运行,不会事先编译。
函数返回值只能通过$?系统变量获得,可以显示加
return返回,如果不加return,则以最后一条命令运行结果作为返回值,return后跟数值n(0-255)

3.代码展示

[root@hadoop03 shell01]# vim fun.sh

#!/bin/bash
function sum()
{
        s=0
        s=$[ $1+$2 ]
        echo "$s"
}
read -p "请输入第一个数值:" n1;
read -p "请输入第二个数值:" n2;
sum $n1 $n2;

[root@hadoop03 shell01]# chmod 777 fun.sh 
[root@hadoop03 shell01]# ./fun.sh 
请输入第一个数值:1
请输入第二个数值:2
3

十、Shell工具

1.cut

cut的工作就是,具体地说就是在文件中负责剪切数据用的。cut命令从文件的每一行剪切字节、字符、字段,并将这些字节、字符、字段输出。

1.cut基本用法

cut[选项参数] filename
默认分隔符是制表符

2.选项参数说明

选项参数功能
-f列号,提取第几列
-d分隔符,按照指定分隔符分割列

3.代码展示

[root@hadoop03 shell01]# vim cut.txt
dong nan
xi bei
[root@hadoop03 shell01]# cut -d " " -f 1 cut.txt
dong
xi
#-d是按照什么分割,演示里面是按照双引号里面的空格分隔
#-f是提取第几列,演示里面是提取第二列
[root@hadoop03 shell01]# cut -d " " -f 2 cut.txt
nan
bei
#提取第三列则会为空
[root@hadoop03 shell01]# cut -d " " -f 3 cut.txt


#下面这段语句和上面那段语句目的一样,不过下面的是通过管道找出指定目标字符,再按照空格切割,提取第一列
[root@hadoop03 shell01]# cat cut.txt |grep "dong" |cut -d " " -f 1dong
[root@hadoop03 shell01]# cat cut.txt |grep "dong" |cut -d " " -f 2nan
#查看系统变量
[root@hadoop03 shell01]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/module/jdk1.8.0_212/bin:/opt/module/hadoop-3.1.3/bin:/opt/module/hadoop-3.1.3/sbin:/root/bin:/home/shenbaoyun/bin:/opt/module/jdk1.8.0_212/bin:/opt/module/hadoop-3.1.3/bin:/opt/module/hadoop-3.1.3/sbin:/root/bin
#提取系统变量从第二个到最后
[root@hadoop03 shell01]# echo $PATH |cut -d : -f 2-
/usr/local/bin:/usr/sbin:/usr/bin:/opt/module/jdk1.8.0_212/bin:/opt/module/hadoop-3.1.3/bin:/opt/module/hadoop-3.1.3/sbin:/root/bin:/home/shenbaoyun/bin:/opt/module/jdk1.8.0_212/bin:/opt/module/hadoop-3.1.3/bin:/opt/module/hadoop-3.1.3/sbin:/root/bin
#提取系统变量第二个
[root@hadoop03 shell01]# echo $PATH |cut -d : -f 2
/usr/local/bin
#提取系统变量第一个和第二个以双引号:为分隔符
[root@hadoop03 shell01]# echo $PATH |cut -d : -f -2
/usr/local/sbin:/usr/local/bin

详情参考管道详解

2.sed

sed是一种流编辑器,一次处理一行内容,处理时把当前处理的行存储在临时缓冲区中,称为模式空间,接着用sed命令处理缓冲区的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,随之不断重复,直至结束。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件,可以将数据行进行替换、删除、新增、选取等特定工作,简化对文件的反复操作,编写转换程序等。

1.基本用法

sed [选项参数] ‘comand’ filename

2.选项参数说明

选项参数功能
-e直接在指令列模式上进行sed的动作编辑

3.命令功能描述

常用命令功能描述
a新增,在当前行下面插入文本
i在当前行上面插入文本
c把选定的行改为新的文本
d删除,删除选择的行
D删除模板块的第一行
s替换指定字符
h拷贝模板块的内容到内存中的缓冲区
H追加模板块的内容到内存中的缓冲区
g获得内存缓冲区的内容,并替代当前模板块中的文本
G获得内存缓冲区的内容,并追加到当前模板块文本的后面
l列表不能打印字符的清单
n读取下一个输入行,用下一个命令处理新的行而不是用第一个命令
N追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码
p打印模板块的行。 P(大写) 打印模板块的第一行
q退出Sed
!表示后面的命令对所有没有被选定的行发生作用
=打印当前行号
#把注释扩展到下一个换行符以前

4.代码展示

#创建一个sed.txt文件
[root@hadoop03 shell01]# vim sed.txt
dong nan
xi bei
wo wo
ai ai

ni ni
#将mei nv这两个词插入到sed.txt文件的第二行中
[root@hadoop03 shell01]# sed '2a mei nv' sed.txt 
dong nan
xi bei
mei nv
wo wo
ai ai

ni ni
#cat发现并未改变文件内容
[root@hadoop03 shell01]# cat sed.txt 
dong nan
xi bei
wo wo
ai ai

ni ni
#删除sed.txt文件中所有带wo的行
[root@hadoop03 shell01]# sed '/wo/d' sed.txt 
dong nan
xi bei
ai ai

ni ni
#删除sed.txt文件中所有内容
[root@hadoop03 shell01]# sed 'd' sed.txt 
#查看后发现并未删除,因为sed不会对文件做出改变,除非使用重定向存储输出
[root@hadoop03 shell01]# cat sed.txt 
dong nan
xi bei
wo wo
ai ai

ni ni
#重定向sed.txt文件到sed文件>会清空文件再添加>>会在文件末尾追加
[root@hadoop03 shell01]# [root@hadoop03 shell01]# sed "d" sed.txt > sed.txt
#ll发现
[root@hadoop03 shell01]# ll
-rw-r--r-- 1 root root   0 Dec 16 18:36 sed.txt
#将sed文件中的第二行删除,并将文件中的wo全部替换(g)为ni
[root@hadoop03 shell01]# sed -e '2d' -e 's/wo/ni/g' sed.txt 
dong nan
ni ni
ai ai

ni ni

3.awk

awk是一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分在进行分割处理

1.基本语法

awk[选线参数] ‘pattern1{action1} pattern2{action2}’ filename
pattern:表示awk在数据中查找的内容,就是匹配模式
action:在找到匹配内容时所执行的一系列命令

2.选项参数说明

选项参数功能
-F指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式
-v复制一个用户定义变量

3.代码展示

#搜索以root开头的所有行,并输出该结果的第七行
[root@hadoop03 shell01]# awk -F: '/^root/{print $7}' passwd
/bin/bash
#搜索以root开头的所有行,并输出该行的第一列和第七列,以逗号分割
[root@hadoop03 shell01]# awk -F: '/^root/{print $1","$7}' passwd 
root,/bin/bash

4.awk的内置变量

变量说明
FILENAME文件名
NR已读的记录数
NF浏览记录的域的个数

5.代码展示

#统计passwd文件名,每行的行号NR,每行的列数NF
[root@hadoop03 shell01]# awk -F: '{print "filename:"FILENAME",linenumber:" NR ",columns:" NF}' passwd
filename:passwd,linenumber:1,columns:7
filename:passwd,linenumber:2,columns:7
filename:passwd,linenumber:3,columns:7

4.sort

sort命令时将文件进行排序,并将排序结果标准输出

1.基本语法

sort(选项)(参数)

选项说明
-n依照数值的大小排序
-r以相反的顺序排序
-t设置排序时所用的分割字符
-k指定需要排序的列

2.代码展示

#按照冒号:分割后的第二列倒叙排序
[root@hadoop03 shell01]# sort -t : -nrk 2 sort.sh 
aa:10:8.9
bb:8:9.7
cc:7:8.9
#按照冒号:分割后的第三列倒叙排序
[root@hadoop03 shell01]# sort -t : -nrk 3 sort.sh 
bb:8:9.7
cc:7:8.9
aa:10:8.9

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值