shell第11章shell脚本
2018-10-02 本文已影响22人
Chaweys
什么是shell?
我们在Linux中输入命令的界面就称为shell,支持如下功能:
1、命令补齐tab键
2、记录历史命令
3、通配符
4、快捷键
5、命令别名:alias 用法:alias 命令别名='具体的命令'
alias ld='ll -h'
Bash shell:
Shell的版本:
shell脚本的版本,目前最常用的是:/bin/bash,也是linux默认的shell版本
cat /etc/shells:可查看系统中shell可用的版本
[root@localhost home]# echo $SHELL //SHELL是一个变量,查看用户自己的默认shell
/bin/bash
[root@localhost home]# echo $0 //查看当前系统默认的shell
-bash
什么是shell脚本?
其实就是利用shell的功能所写的一个程序,这个程序是使用纯文本文件,将一些shell的语法与命令写在里面,搭配正则表达式、管道命令与数据流重定向等等功能,以达到我们想要的目的。
如果编写良好,shell脚本自身独立执行时也可以变为强大的命令行工具,甚至可以由其他脚本进一步利用。
#最简单的shell:
命令解释权#!
Bash shell脚本的第一行以【#!】开头,表示文件是可执行的shell脚本,如果不写【#!】那么就表示该文件不可被shell执行
【#!】后面跟上的路径名称是命令解释器,由于Bash shell脚本将由Bash shell解释,因此开头为:#! /bin/bash
变量的介绍:
变量:用来存储一个可变的值,通常用于大写来命名
预设变量PATH,定义了常用命令的绝对路径,因此我们可以直接输入命令
echo命令可以输出一些语句,也可以读取变量的值
$符号用来读取变量内容
变量分为两种:普通变量,环境变量
普通变量介绍:
普通变量:一般是大写,但亦可以小写,名字由字母、数字和_组成
例子:
NAME=hudechao //定义变量
echo $NAME //读取变量
unset NAME //取消变量的定义
环境变量介绍:
环境变量:就是系统预定义的参数。在wins下也有。
在Linux中环境变量按照生存周期可以分为两大类:
1、临时的
2、永久的
临时的环境变量:使用export命令声明即可,变量在关闭shell时失效
语法: export变量名=值
export定义临时的环境变量,在切换shell的时候,临时的环境变量也会生效。
临时的环境变量介绍:export命令
[root@localhost shell-hudechao]# export ab=123
[root@localhost shell-hudechao]# echo $ab
123
[root@localhost shell-hudechao]# sh
sh-4.2# echo $ab
123 #可以看出,定义了临时变量ab,切换shell后,临时变量扔生效【如果是普通变量赋值,切换shell后会失效】
临时的环境变量介绍:su命令
su hudechao //未关闭shell的切换用户,即环境变量还是原来用户的环境
su - hudechao //关闭了shell的切换,加了-的切换才是真正的切换用户
永久的环境变量介绍
永久的:需要修改配置文件,变量才会永久生效。
永久的环境变量分为:全局和用户
定义全局变量的文件:/etc/bashrc和/etc/profile
定义用户变量的文件:~/.bashrc和~/.bash_profile
位置变量:
用数字表示的变量
$0表示脚本名称
$1表示第一个参数
$2表示第二个参数,以此类推,$3、$4
$?表示程序退出的代表(一般0代表执行成功,非0表示执行失败)
$*代表所有参数内容(有哪些参数)
$$代表当前进程的PID号码
$#代表当前shell的参数个数
$@代表所有参数内容(逐个读取)
转义字符:
转义字符有三种:\ ' ' " "
反斜杠\:可以消除紧跟在字符后面的单个字符的特殊含义
[root@localhost shell-hudechao]# echo \#123 \#123
#123 #123
单引号' ' :可以屏蔽一切特殊字符,但是双引号不会屏蔽$符号,其他都屏蔽
[root@localhost shell-hudechao]# echo '#123 #123 $B'
#123 #123 $B
[root@localhost shell-hudechao]# echo "#123 #123 $B"
#123 #123 99
case语句:
case $变量名 in
变量名1) #判断执行脚本时输入的参数和此变量名1的值
echo语句
;; #两个;;分号表示一个判断结束
变量名2)
echo语句
;; #两个;;分号表示一个判断结束
*) #上面的判断都为false时
echo语句
;; #两个;;分号表示一个判断结束
esac #esac表示case语句的结束
#!/bin/bash
case $1 in #$1表示执行脚本时输入的第一参数获取到
1) #获取到参数值和1比较,如果相等就打印如下内容
echo "input 2"
;;
2)
echo "input 1"
;;
*)
echo "./3.sh input 1 or 2"
;;
esac
#!/bin/bash
echo "please input number (1-5)"
read num
echo "your input number is $num"
case $num in
1)
echo "one" i
;;
2)
echo "two"
;;
3|4|5)
echo "three to five"
;;
*)
echo "please input 1-5"
;;
esac
整数测试,数值比较【只适用数值】:
-eq等于
-ne不等于
-gt大于
-ge大于等于
-lt小于
-le小于等于
bash字符【即适用字符串,也适用整型】:
>大于
>小于
==等于
操作符,判断式[ ] 常用到:
-f测试其是否为普通文件,即ls -l时文件类型为-的文件
-d测试其是否为目录文件,即ls -l时文件类型为d的文件
-e测试文件是否存在;存在为真,否则为假
-r测试文件对当前用户来说是否可读
-w测试文件对当前用户来说是否可写
-x测试文件对当前用户来说是否可执行
-s测试文件大小是否为空,不空则真,空则假
逻辑操作符:
-a:与
-o:或
! :非
&&与运算
| |或运算
单分支if语句:
if [条件]; then
执行语句1
执行语句2
...
fi #fi表示if语句的结束
双分支if语句:
if [条件]; then
执行语句1
执行语句2
...
else
执行语句1
执行语句2
fi
多分支if语句:
if [条件1]; then
执行语句1
执行语句2
...
elif [条件2]; then
执行语句1
执行语句2
...
elif [条件3]; then
执行语句1
执行语句2
...
else
执行语句1
执行语句2
...
fi
if脚本运用
1、编写个脚本,测试系统中是否存在有/student/dir1目录,如果没有则创建:
#!/bin/bash
a="/student/dir1"
if [ ! -d "$a" ];then #[ ]之间内容要带有空格,判断目录是否存在
mkdir -p $a
fi
2、编写一个成绩小脚本,90-100显示优秀,70-80显示一般,其他不及格
#!/bin/bash
read -p "请输入你的成绩:" a #-p 参数指定read命令一个参数,输入值写入变量a
if [ "$a" -ge 90 ] && [ "$a" -le 100 ];then
echo "你的成绩优秀"
elif [ "$a" -ge 70 ] && [ "$a" -le 89 ];then
echo "你的成绩一般"
else
echo "你的成绩不及格"
fi
3、编写一个脚本,生成两个随机数,比较其大小;显示较大的数;bash有个内置变量:$RANDOM
#!/bin/bash
a=$RANDOM
b=$RANDOM
echo "a=$a"
echo "b=$b"
if [ $a -ge $b ];then
echo "the max number is:$a"
else
echo "the max number is:$b"
fi
4、编写一个脚本,判断一个随机数的奇偶性
#!/bin/bash
a=$RANDOM
echo "a=$a"
if [ $[ $a%2 ] -eq 0 ];then
echo "It's偶数"
else
echo "It's奇数"
fi
循环语句:
在生产环境下有大量需要重复运行的指令,这里shell给我们提供了for while until select 循环语句以实现指令的反复执行功能.
在所有循环语句中,变量必须要有初始值,每次运行命令都要进行条件过滤,只有满足条件才会运行命令,否则不执行.
1、for——shell风格:
for——shell风格
语法:
for变量 in {list}
do
命令
done
例子:
#!/bin/bash
for a in {1,2,3,4}
do
echo $a
done
2、for——C语言风格:
语法:
for ((变量赋值;判断;算法 ))
do
命令
done
例子:
求1到10的和
#!/bin/bash
sum=0
for (( i=0;i<=100;i++)) #第一个括号是C语言的表达式,在外面的括号是做的for循环while的用法和for一样,util则是条件为假时执行语句。
do
sum=$((sum+i)) #第一个括号是做的运算,在外面的括号是用到$取值用i=0
done
echo $sum
3、while循环:
#!/bin/bash
while ((i<=100))
do
sum=$((sum+i))
i=$((i+1))
done
echo $sum