1_Shell脚本入门
1、Shell作用
-
通过Shell命令与编程语言来
提高linux系统的管理工作效率
-
通过编写
Shell命令发送给linux内核去执行
, 操作就是计算机硬件. 所以Shell命令是用户操作计算机硬件的桥梁
2、Shell解析器
(1)Linux提供的Shell解析器有:cat /etc/shells
[root@pu8test ~]# cat /etc/shells /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash /bin/ksh /bin/rksh
(2)Centos默认的解析器是bash:echo $SHELL
[root@pu8test ~]# echo $SHELL /bin/bash
3、Shell脚本入门
(1)脚本格式:脚本以
#!/bin/bash
开头(指定解析器,默认的,可以不写)(2)直接输出helloworld:
echo "helloworld"
。
举例:创建一个Shell脚本,输出helloworld
[root@pu8test shell]# vi helloword.sh #! /bin/bash echo "helloword" [root@pu8test shell]# sh helloword.sh helloword [root@pu8test shell]#
步骤:
编写脚本-执行脚本
注意:
bash或sh 脚本的相对路径或绝对路径 ,本质是bash解析器执行脚本,所以脚本本身不需要执行权限
脚本的绝对路径或相对路径(必须具有可执行权限)
./helloworld.sh /home/helloworld.sh
知识拓展:
pwd 查看目录 mkdir 创建文件夹 touch 新建文件 cat 查看内容
权限不够修改办法:
chmod 777 helloworld.sh
(最高权限)
举例:Shell脚本 在XXX目录下创建一个hobby.txt,在hobby.txt文件中增加“I love math”
[root@pu8test shell]# vim hobby.sh #! /bin/bash touch /tmp/shell/hobby.txt echo "I Love math" >> hobby.txt [root@pu8test shell]# sh hobby.sh [root@pu8test shell]# cat hobby.txt I Love math [root@pu8test shell]#
4、Shell中的变量
-
常用系统变量:$HOME(目录)、$PWD(目录)、$SHELL(解析器)、$USER(当前用户)等
-
自定义变量:
-
定义变量:变量=值(等号左右不能有空格)
-
撤销变量:unset 变量
-
声明静态变量:readonly 变量,注意:不能unset。
-
声明全局变量:export 变量
-
-
特殊变量:
-
$n:n为数字,$0代表该脚本名称,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}。
-
$#:获取所有输入参数个数,常用于循环。
-
-
$@:代表命令行中所有的参数,它把每个参数区分对待。
-
$?:最后一次执行的命令的返回状态。如果为0,表示上一条命令执行正确;为非0,则上一条命令执行不正确。
-
知识拓展:
变量名称可以由字母、数字和下划线组成,但不能以数字开头,环境变量名建议大写。
在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
变量的值如果有空格,需要使用双引号或单引号括起来。
举例:输出该脚本文件名称、输入参数1和输入参数2的值,获取输入参数的个数和所有输入参数的值,判断最后一条命令是否正确执行
[root@pu8test shell]# vim parameter.sh #! /bin/bash echo "$0 $1 $2" echo $# echo $* echo $@ echo $? [root@pu8test shell]# sh parameter.sh one tow three parameter.sh one tow 3 one tow three one tow three 0 [root@pu8test shell]#
5、运算符
-
基本语法:
-
$((运算式))
或$[运算式]
-
expr +(加)、-(减)、*(乘)、/(除)、%(取余)(expr运算符间要有空格)
-
举例: 计算(2+3)*4的值。(三种方法计算)
[root@pu8test shell]# expr `expr 2 + 3` \* 4 20 [root@pu8test shell]# s=$[(2+3)*4] [root@pu8test shell]# echo $s 20 [root@pu8test shell]# s=$(((2+3)*4)) [root@pu8test shell]# echo $s 20
6、条件判断
-
基本语法:[ condition ](
注意 condition 前后要有空格
)
注意:条件非空即为true,[ pqh ]返回true,[]返回false。
-
多条件判断:[ condition ] && echo OK || echo notok
-
&&:上一条命令执行成功时,才执行下一条命令。
-
||:上一条命令执行失败后,才执行下一条命令。
-
-
常用判断条件:
-
两个整数之间比较:
-
=:字符串比较
-
-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)
-
-
举例:
## 23是否大于等于22 [root@pu8test shell]# [ 23 -ge 22 ] [root@pu8test shell]# echo $? 0 [root@pu8test shell]# ## helloworld.sh是否具有写权限 [root@pu8test shell]# [ -w helloword.sh ] [root@pu8test shell]# echo $? 0 [root@pu8test shell]#
7、流程控制(重点)
if判断
-
基本语法:
## 基本语法 if [ 条件判断式 ];then 程序 fi 或者 if [ 条件判断式 ] then 程序 fi ## ################################################# ## 注意事项: ## 1. 中括号和条件判断式之间必须有空格。 ## 2. if后要有空格。 ## 案例:输入一个数字,如果是1,则输出one,如果是2,则输出two,如果是其他,则什么都不输出。 #! /bin/bash if [ $1 = 1 ] then echo one elif [ $1 = 2 ] then echo two fi
case语句
-
基本语法:
## 基本语法 case $变量名 in "值1") 程序1 ;; "值2") 程序2 ;; *) 变量都不是以上值,则执行此程序 ;; esac ## ################################################# ## 注意事项: ## 1. case行尾必须为单词“in”,每个模式匹配必须以“)”结束。 ## 2. 双分号“;;”表示命令序列结束,相当于java的break。 ## 3. 最后的“*)”表示默认模式,相当于java中的default。 ## 案例:输入一个数字,如果是1,则输出one,如果是2,则输出two,如果是其他,则输出number。 #! /bin/bash case $1 in 1) echo one ;; 2) echo two ;; *) echo number ;; esac
for循环
-
基本语法:
## 基本语法 for((初始值;循环控制;条件变量变化)) do 程序 done 或 for 变量 in 值1 值2 值3 do 程序 done ## ################################################# ## 案例:从1加到100。 [root@pu8test shell]# vim test_for.sh #! /bin/bash sum=0 for(( i=1;i<=100;i++ )) do sum=$[sum+i] done echo $sum [root@pu8test shell]# sh test_for.sh 5050 [root@pu8test shell]#
while循环
-
基本语法:
## 基本语法 while [ 条件判断式 ] do 程序 done ## ################################################# ## 注意事项:中括号和条件判断式之间必须有空格。 ## 案例:从1加到100。 [root@pu8test shell]# vim test_while.sh #! /bin/bash sum=0 i=1 while [ $i -le 100 ] do sum=$[sum+i] i=$[i+1] done echo $sum [root@pu8test shell]# sh test_while.sh 5050 [root@pu8test shell]#
8、read读取控制台输入
-
基本语法:
read(选项)(参数)
-
选项
-
-p:指定读取时的提示符。
-
-t:指定读取值时等待的时间(秒)
-
-
参数:变量(指定读取值的变量名)
-
## 案例:提示7秒内,读取控制台输入的名称 [root@pu8test shell]# vim test_read.sh #! /bin/bash read -t 7 -p "Enter your name:" NAME echo $NAME [root@pu8test shell]# sh test_read.sh Enter your name: [root@pu8test shell]# sh test_read.sh Enter your name:mmdz mmdz [root@pu8test shell]#
9、函数
-
系统函数
-
basename命令:删掉所有的前缀包括最后一个'/'字符,然后将字符串显示出来。
-
基本语法:
basename [string/pathname][suffix]
注意事项:suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。
-
-
dirname命令:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径。
-
基本语法:
dirname 文件绝对路径
-
## 案例:截取/tmp/shell/hobby.txt路径的文件名称 [root@pu8test shell]# basename /tmp/shell/hobby.txt hobby.txt [root@pu8test shell]# basename /tmp/shell/hobby.txt .txt hobby [root@pu8test shell]# ## 案例:获取hobby.txt文件路径 [root@pu8test shell]# dirname /tmp/shell/hobby.txt /tmp/shell [root@pu8test shell]#
-
-
自定义函数:
-
基本语法:
## 基本语法 [function] funname[()] { Action; [return int;] } funname ## ################################################# ## 注意事项: ## 1.在调用函数之前必须先声明函数,shell脚本是逐行运行,不会像其他语言一样先编译。 ## 2.函数返回值,只能通过&?系统变量获得,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-225)。 #!/bin/bash function sum() { s=$[$1+$2] echo $s } read -p "Enter parameter1:" P1 read -p "Enter parameter2:" P2 sum P1 P2 输出: [pqh@localhost datas]$ sh function.sh Enter parameter1:2 Enter parameter2:3 5
-
10、Shell工具(重点)
-
cut:从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。
-
基本用法:
cut[选项参数] filename
(默认分隔符是制表符) -
选项参数:
-
-f:列号,提取第几列。
-
-d:分隔符,按照指定分隔符分割列。
-
-
-
sed:一种流编辑器,一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕,接着处理下一行,不断重复直到文件末尾。文件内容并没有改变,除非使用重定向存储输出。
-
基本语法:
sed[选项参数] 'command' filename
-
选项参数:
-
-e:直接在指令列模式上进行sed的动作编辑。
-
-
命令功能:
-
a:新增,a的后面可以接字串,在下一行出现。
-
d:删除。
-
s:查找并替换。
-
-
-
awk:一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。
-
基本用法:
awk[选项参数] ‘pattern1{action1} pattern2{action2}···' filename
-
pattern:表示AWk在数据中查找的内容,就是匹配模式。
-
action:在找到匹配内容时所执行的一系列命令。
注意:只有匹配了pattern的行才会执行action。
-
-
选项参数:
-
-F:指定输入文件折分隔符。
-
-v:赋值一个用户定义变量。
-
-
action内置变量:
-
FILENAME:文件名。
-
NR:已读的记录数。
-
NF:浏览记录的域的个数。
-
-
-
sort:将文件进行排序,并将排序结果标准输出。
-
基本语法:
sort(选项)(参数)
-
选项:
-
-n:依照数值的大小排序。
-
-r:以相反的顺序排序。
-
-t:设置排序时所用的分隔字符。
-
-
-