您的位置:首页 > 运维架构 > Shell

Linux学习笔记三 shell基础

2017-12-29 17:54 651 查看

1. Shell脚本的执行方式

1> shell简介
a> Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请
求以便运行程序的界面系统级程序,用户可以用Shell来启动挂起、停止
甚至是编写一些程序。
b> Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。
Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。
c> Shell的两种主要语法类型有Bourne和C,这两种语法彼此不兼容。
Bourne家族主要包括sh、 ksh、 Bash、 psh、 zsh; C家族主要包括: csh、 tcsh
d> Bash与sh兼容, 现在使用的Linux就是使用Bash作为用户的基本Shell。

2> echo输出命令

语法:
echo [选项] [输出内容]
选项:
-e:支持反斜线控制的字符转换
\\ 输出\本身
\a 输出警告音
\b 退格键, 也就是向左删除键
\c 取消输出行末的换行符。 和“-n” 选项一致
\e ESCAPE键
\f 换页符
\n 换行符
\r 回车键
\t 制表符, 也就是Tab键
\v 垂直制表符
\0nnn 按照八进制ASCII码表输出字符。 其中0为数字零, nnn是三位八进    制数
\xhh 按照十六进制ASCII码表输出字符。 其中hh是两位十六进制数
示例:
echo -e "ab\bc"
#删除左侧字符

echo -e "a\tb\tc\nd\te\tf"
#制表符与换行符
echo -e \"\x61\t\x62\t\x63\n\x64\t\x65\t\x66"
#按照十六进制ASCII码也同样可以输出
echo -e "\e[1;31m abcd \e[0m"
#输出颜色
#30m=黑色, 31m=红色, 32m=绿色, 33m=黄色
#34m=蓝色, 35m=洋红, 36m=青色, 37m=白色

3> 脚本执行

 赋予执行权限,直接运行
chmod 755 hello.sh
./hello.sh
 通过Bash调用执行脚本
bash hello.sh

4> windows上编写的shell脚本linux无法执行

是因为window与Linux回车不一样
Linux回车:  $
window回车: ^M$
解决办法:
doc2unix filename


2. Bash的基本功能

1> 历史命令
语法:
history [选项] [历史命令保存文件]
选项:
-c: 清空历史命令
-w: 把缓存中的历史命令写入历史命令保存文件~/.bash_history
历史命令默认会保存1000条,可以在环境变量配置文件/etc/profile中进行修改历史命令的调用
使用上、下箭头调用以前的历史命令
使用“!n”重复执行第n条历史命令
使用“!!”重复执行上一条命令
使用“!字串”重复执行最后一条以该字串开头的命令

2> 历史命令的调用
 使用上、下箭头调用以前的历史命令
 使用“!n”重复执行第n条历史命令
 使用“!!”重复执行上一条命令
 使用“!字串”重复执行最后一条以该字串开头的命令

3> 命令与文件补全
 在Bash中,命令与文件补全是非常方便与常用的功能,我们只要在输入命令或文件时,按“Tab”键就会自动进行补全

4> 命令别名
alias 别名='原命令'
#设定命令别名
alias
#查询命令别名

5> 命令执行时顺序
  第一顺位执行用绝对路径或相对路径执行的命令。
  第二顺位执行别名。
  第三顺位执行Bash的内部命令。
  第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令。

6> 让别名永久生效
vi /root/.bashrc

7> 删除别名
unalias 别名

8> Bash常用快捷键
ctrl+C      强制终止当前的命令。
ctrl+L      清屏, 相当于clear命令。
ctrl+U      删除或剪切光标之前的命令
ctrl+Y      粘贴ctrl+U或ctrl+K剪切的内容
ctrl+R      在历史命令中搜索, 按下ctrl+R之后, 就会出现搜索界面, 只要输入搜索内容,就会从历史命令中搜索。
ctrl+D      退出当前终端

9> 标准输入输出

设备    设备文件名     文件描述符      类型
键盘    /dev/stdin      0            标准输入
显示器  /dev/sdtout     1
1c207
标准输出
显示器  /dev/sdterr     2            标准错误输出

10> 输出重定向,如下图






11> 输入重定向

语法: wc [选项] [文件名]
选项:
-c 统计字节数
-w 统计单词数
-l 统计行数

 命令<文件      把文件作为命令的输入
 命令<< 标识符
…
标识符          把标识符之间内容作为命令的输入

12> 多命令顺序执行,如图




示例:
ls ; date ; cd /user ; pwd

dd if=输入文件 of=输出文件 bs=字节数 count=个数

选项:
if=输入文件 指定源文件或源设备
of=输出文件 指定目标文件或目标设备
bs=字节数 指定一次输入/输出多少字节,即把这些字节看做        一个数据块
count=个数 指定输入/输出多少个数据块

13> 管道符
命令1 | 命令2
#命令1的正确输出作为命令2的操作对象

14> grep [选项] "搜索内容" 文件名
选项:
-i: 忽略大小写
-n: 输出行号
-v: 反向查找
--color=auto 搜索出的关键字用颜色显示

15> 通配符,如下图




16> Bash中其他特殊符号,如下图




3. Bash变量

1> 变量简介
□ 变量是计算机内存的单元,其中存放的值可以改变。当Shell脚本需要保存一些信息时,如一个文件名或是一个数字,
就把它存放在一个变量中。每个变量有一个名字,所以很容易引用它。 使用变量可以保存
有用信息,使系统获知用户相关设置,变量也可以用于保存暂时信息

2> 变量设置规则
 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。如果变量名是“2name”则是错误的。
 在Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必修指定变量类型为数值型。
 变量用等号连接值,等号左右两侧不能有空格。
 变量的值如果有空格,需要使用单引号或双引号包括。
 在变量的值中,可以使用“\”转义符。
 如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含“$变量名”或用${变量名}包含。
 如果是把命令的结果作为变量值赋予变量则需要使用反引号或$()包含命令。
 环境变量名建议大写,便于区分

3> 变量分类
  用户自定义变量
  环境变量: 这种变量中主要保存的是和系统操作环境相关的数据。
  位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。
  预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。

4> 本地变量
 变量定义
name="123"
 变量叠加
aa=123
aa="$aa"456
aa=${aa}789
 变量调用
echo $name
 变量查看
set
 变量删除
unset name

5> 环境变量
a> 简介
用户自定义变量只在当前的Shell中生效,而环境变量会在当前Shell和这个Shell的所有子Shell当中生效。
如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有Shell中生效
b> 设置环境变量
export 变量名=变量值
#申明变量
env
#查询变量
unset 变量名
#删除变量
c> 系统常见环境变量
 PATH:系统查找命令的路径
示例:echo $PATH
 PATH="$PATH":/root/sh
#PATH变量叠加
 PS1:定义系统提示符的变量
\d:显示日期,格式为“星期 月 日”
\h:显示简写主机名。如默认主机名“localhost”
\t:显示24小时制时间,格式为“HH:MM:SS”
\T:显示12小时制时间,格式为“HH:MM:SS”
\A:显示24小时制时间,格式为“HH:MM”
\u:显示当前用户名
\w:显示当前所在目录的完整名称
\W:显示当前所在目录的最后一个目录
\#:执行的第几个命令
\$:提示符。如果是root用户会显示提示符为“#”,如果是普通用户会显示提示符为“$
示例:
 [root@localhost ~]# PS1='[\u@\t \w]\$ '
 [root@04:50:08 /usr/local/src]#PS1='[\u@\@ \h \# \W]\$‘
 [root@04:53 上午 localhost 31 src]#PS1='[\u@\h \W]\$ '

6> 位置参数变量,如下图




示例:
#!/bin/bash
echo "A total of $# parameters"
#使用$#代表所有参数的个数
echo "The parameters is: $*"
#使用$*代表所有的参数
echo "The parameters is: $@"
#使用$@也代表所有参数

示例:
$*与$@的区别

#!/bin/bash
for i in "$*"
#$*中的所有参数看成是一个整体,所以这个for循环只会循环一次
do
echo "The parameters is: $i"
done
x=1
for y in "$@"
#$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次
do
echo "The parameter$x is: $y"
x=$(( $x +1 ))
done

7> 预定义变量,如下图




示例:

######################################
# Author     :lcuwang                #
# Create Date:2017-12-25             #
# Email      :lcuwang@163.com        #
# Version    :1.0                    #
# Description:                       #
######################################

#!/bin/bash

echo "The current process is $$"
#输出当前进程的PID。
#这个PID就是variable.sh这个脚本执行时,生成的进程的PID
find /root -name hello.sh &
#使用find命令在root目录下查找hello.sh文件
#符号&的意思是把命令放入后台执行
echo "The last one Daemon process is $!"

8> 接收键盘输入
语法:
read [选项] [变量名]
选项:
-p “提示信息”:在等待read输入时,输出提示信息
-t 秒数: read命令会一直等待用户输入,使用此选项可以指定等待时间
-n 字符数: read命令只接受指定的字符数,就会执行
-s: 隐藏输入的数据,适用于机密信息的输入
示例:
######################################
# Author     :lcuwang                #
# Create Date:2017-12-27             #
# Email      :lcuwang@163.com        #
# Version    :1.0                    #
# Description:                       #
######################################

#!/bin/bash
read -t 30 -p "Please input your name:" name
#提示“请输入姓名”并等待30秒,把用户的输入保存入变量name中
echo "Name is $name"
read -s -t 30 -p "Please input you age:" age
#年龄是隐私,所以我们用“-s”选项隐藏输入
echo -e "\n"
echo "Age is $age"
read -n 1 -t 30 -p "Please select your gender[M/W]:" gender
#使用“-n 1”选项只接收一个输入字符就会执行(都不用输入回车)
echo -e "\n"
echo "Sex is $gender"


4. Bash运算符

1> 数值运算与运算符
a> declare声明变量类型
语法:declare [+/-][选项] 变量名
选项:
-: 给变量设定类型属性
+: 取消变量的类型属性
-i: 将变量声明为整数型(integer)
-x: 将变量声明为环境变量
-p: 显示指定变量的被声明的类型
b> 数值运算—方法1

[root@localhost shell]# aa=11
[root@localhost shell]# bb=22
[root@localhost shell]# declare -i cc=$aa+$bb
[root@localhost shell]# echo $cc
33
c> 方法2: expr或let数值运算工具
[root@localhost shell]# aa=11
[root@localhost shell]# bb=22
[root@localhost shell]# dd=$(expr $aa + $bb)
#dd的值是aa和bb的和。注意“+”号左右两侧必须有空格
[root@localhost shell]# echo $dd
33
d> 方法3: “$((运算式))”或“$[运算式]” # 推荐使用方式
[root@localhost shell]# echo $(($aa+$bb))
33
[root@localhost shell]# echo $[$aa+$bb]
33

e> 运算符如下图:




[root@localhost ~]# aa=$(( (11+3)*3/2 ))
#虽然乘和除的优先级高于加,但是通过小括号可以调整运算优先级
[root@localhost ~]# bb=$(( 14%3 ))
#14不能被3整除,余数是2
[root@localhost ~]# cc=$(( 1 && 0 ))
#逻辑与运算只有想与的两边都是1,与的结果才是1,否则与的结果是0

2> 变量测试与内容替换




示例:测试x=${y-新值}
[root@localhost ~]# unset y
#删除变量y
[root@localhost ~]# x=${y-new}
#进行测试
[root@localhost ~]# echo $x
new
#因为变量y不存在,所以x=new
[root@localhost ~]# y=""
#给变量y赋值为空
[root@localhost ~]# x=${y-new}
#进行测试
[root@localhost ~]# echo $x[root@localhost ~]# y=old
#给变量y赋值
[root@localhost ~]# x=${y-new}
#进行测试
[root@localhost ~]# echo $x
old


5. 环境变量配置文件

1> 简介
 环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量,
比如PATH、HISTSIZE、 PS1、 HOSTNAME等默认环境变量。
 /etc/profile
 /etc/profile.d/*.sh
 ~/.bash_profile
 ~/.bashrc
 /etc/bashrc

2> /etc/profile的作用:
 USER变量:
 LOGNAME变量:
 MAIL变量:
 PATH变量:
 HOSTNAME变量:
 HISTSIZE变量:
 umask:
 调用/etc/profile.d/*.sh文件

3> ~/.bash_profile的作用
 调用了~/.bashrc文件。
 在PATH变量后面加入了“:$HOME/bin”这个目录

4> ~/.bashrc的作用
 定义默认别名
 调用/etc/bashrc

5> /etc/bashrc的作用
 PS1变量
 umask
 PATH变量
调用/etc/profile.d/*.sh文件

6> 注销时生效的环境变量配置文件
 ~/.bash_logout

7> 其他配置文件
 ~/bash_history

8> Shell登录信息
 本地终端欢迎信息: /etc/issue,如下图




 远程终端欢迎信息: /etc/issue.net
a> 转义符在/etc/issue.net文件中不能使用
b> 是否显示此欢迎信息,由ssh的配置文件/etc/ssh/sshd_config决定,加入“Banner/etc/issue.net
”行才能显示(记得重启SSH服务)
 登陆后欢迎信息: /etc/motd
不管是本地登录,还是远程登录,都可以显示此欢迎信息


6. 正则表达式

1> 正则表达式与通配符
 正则表达式用来在文件中匹配符合条件的字符串, 正则是包含匹配。 grep、 awk、sed等命令可以支持正则表达式。
 通配符用来匹配符合条件的文件名,通配符是完全匹配。 ls、 find、 cp这些命令不支持正则表达式,
所以只能使用shell自己的通配符来进行匹配了。

2> 基础正则表达式
如下图,




a> “*”前一个字符匹配0次,或任意多次
 grep "a*" test_rule.txt
# 匹配所有内容,包括空白行
 grep "aa*" test_rule.txt
# 匹配至少包含有一个a的行
 grep "aaa*" test_rule.txt
# 匹配最少包含两个连续a的字符串
 grep "aaaaa*" test_rule.txt
# 匹配最少包含四个连续a的字符串

b> “.” 匹配除了换行符外任意一个字符
 grep "s..d" test_rule.txt
# “s..d”会匹配在s和d这两个字母之间一定有两个字符的单词
 grep "s.*d" test_rule.txt
# 匹配在s和d字母之间有任意字符
 grep ".*" test_rule.txt
# 匹配所有内容

c> “^”匹配行首,“$”匹配行尾
 grep "^M" test_rule.txt
# 匹配以大写“M”开头的行
 grep "n$" test_rule.txt
# 匹配以小写“n”结尾的行
 grep -n "^$" test_rule.txt
# 匹配空白行

d> “[]” 匹配中括号中指定的任意一个字符,只匹配一个字符
 grep "s[ao]id" test_rule.txt
# 匹配s和i字母中,要不是a、要不是o
 grep "[0-9]" test_rule.txt
# 匹配任意一个数字
 grep "^[a-z]" test_rule.txt
# 匹配用小写字母开头的行

e> “[^]” 匹配除中括号的字符以外的任意一个字符
 grep "^[^a-z]" test_rule.txt
# 匹配不用小写字母开头的行
 grep "^[^a-zA-Z]" test_rule.txt
# 匹配不用字母开头的行

f> “\” 转义符
# grep "\.$" test_rule.txt
# 匹配使用“.”结尾的行

g> "\{n\}"表示其前面的字符恰好出现n次
 grep "a\{3\}" test_rule.txt
# 匹配a字母连续出现三次的字符串
 grep "[0-9]\{3\}" test_rule.txt
# 匹配包含连续的三个数字的字符

h> “\{n,\}”表示其前面的字符出现不小于n次
 grep "^[0-9]\{3,\}[a-z]" test_rule.txt
# 匹配最少用连续三个数字开头的行

i> "\{n,m\}" 匹配其前面的字符至少出现n次,最多出现m次
 grep "sa\{1,3\}i" test_rule.txt
# 匹配在字母s和字母i之间有最少一个a,最多三个a


7.字符截取命令

1> cut字段提取命令
语法:
cut [选项] 文件名
选项:
-f 列号: 提取第几列
-d 分隔符: 按照指定分隔符分割列
2> printf命令
语法:
printf ’输出类型输出格式’ 输出内容
输出类型:
%ns: 输出字符串。 n是数字指代输出几个字符
%ni: 输出整数。 n是数字指代输出几个数字
%m.nf: 输出浮点数。 m和n是数字, 指代输出的整数 位数和小数位数。如%8.2f代表共输出8位数,其中2位是小数, 6位是整数。
输出格式:
\a: 输出警告声音
\b: 输出退格键, 也就是Backspace键
\f: 清除屏幕
\n: 换行
\r: 回车, 也就是Enter键
\t: 水平输出退格键, 也就是Tab键
\v: 垂直输出退格键, 也就是Tab键

示例:
[root@localhost ~]# vi student.txt

ID  Name    PHP     Linux   MySQL   Average
1   Lcuwang     82      95      86      87.66
2   Sc      74      96      87      85.66
3   Gao     99      83      93      91.66

printf '%s' $(cat student.txt)

IDNamePHPLinuxMySQLAverage1Lcuwang82958687.662Sc74968785.663Gao99839391.66

#不调整输出格式

printf '%s\t %s\t %s\t %s\t %s\t %s\t \n' $(cat student.txt)

ID  Name    PHP     Linux   MySQL   Average
1   Lcuwang     82      95      86      87.66
2   Sc      74      96      87      85.66
3   Gao     99      83      93      91.66

#调整格式输出

在awk命令的输出中支持print和printf命令
 print: print会在每个输出之后自动加入一个换行符(Linux默认没有print命令)
 printf: printf是标准格式输出命令,并不会自动加入换行符,如果需要换行,需要手工加入换行符

3> awk命令
语法:
awk ‘条件1{动作1} 条件2{动作2}…’ 文件名

条件(Pattern):
一般使用关系表达式作为条件
x > 10      判断变量 x是否大于10
x>=10       大于等于
x<=10       小于等于
动作(Action):
格式化输出
流程控制语句

示例:
[root@localhost ~]# vi student.txt
ID   Name    PHP     Linux   MySQL   Average
1   Lcuwang     82      95      86      87.66
2   Sc      74      96      87      85.66
3   Gao     99      83      93      91.66

a> [root@localhost install]# awk '{printf $2 "\t" $6 "\n"}' student.txt

Name    Average
Lcuwang 87.66
Sc  85.66
Gao 91.66

b> df -h | awk '{print $1 "\t" $3}'
[root@localhost install]# df -h | awk '{print $1 "\t" $3}'
Filesystem  Used
/dev/mapper/VolGroup-lv_root    1.4G
tmpfs   0
/dev/sda1   33M

c> BEGIN
[root@master install]# awk 'BEGIN{printf "This is a transcript \n" }{printf $2 "\t" $6 "\n"}' student.txt
This is a transcript

Name    Average
Lcuwang 87.66
Sc      85.66
Gao     91.66

d> END
[root@master install]# awk 'END{printf "The End \n" }{printf $2 "\t" $6 "\n"}' student.txt

Name    Average
Lcuwang 87.66
Sc      85.66
Gao     91.66
The End

e> FS内置变量
[root@master install]# cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN {FS=":"} {printf $1 "\t" $3 "\n"}'
root    0

f> 关系运算符
[root@master install]#  cat student.txt | grep -v Name | awk '$6 >= 87 {printf $2 "\n" }'
Lcuwang
Gao

4> sed命令
简介:
sed 是一种几乎包括在所有 UNIX 平台(包括 Linux)的轻量级流编辑器。 sed主要
是用来将数据进行选取、替换、删除、新增的命令。
语法:
sed [选项] ‘[动作]’ 文件名
选项:
-n: 一般sed命令会把所有数据都输出到屏幕 ,如果加入此选择,则只会把经过sed命令处理的行输出到屏幕。
-e: 允许对输入数据应用多条sed命令编辑
-i: 用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出
动作:
a \: 追加,在当前行后添加一行或多行。添加多行时,除最后一行外,每行末尾需要用“\”代表数据未完结。
c \: 行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾需用“\”代表数据未完结。
i \: 插入,在当期行前插入一行或多行。插入多行时,除最后一行外,每行末尾需要用“\”代表数据未完结。
d: 删除,删除指定的行。
p: 打印,输出指定的行。
s: 字串替换,用一个字符串替换另外一个字符串。格式为“行范围s/旧字串/新字串/g”(和vim中的替换格式类似) 。

示例:
[root@localhost ~]# vi student.txt

a> 行数据操作
sed '2p' student.txt
#查看文件的第二行(打印所有)

sed -n '2p' student.txt
#查看文件的第二行

sed '2,4d' student.txt
#删除第二行到第四行的数据,但不修改文件本身

sed '2a hello' student.txt
#在第二行后追加hello

sed '2i hello \
world' student.txt
#在第二行前插入两行数据

sed '2c No such person' student.txt
#数据替换

b> 字符串替换
sed ‘s/old/new/g’ filename
#替换filename中的所有old为new

sed '3s/74/99/g' student.txt
#在第三行中,把74换成99

sed -i '3s/74/99/g' student.txt
#sed操作的数据直接写入文件

sed -e 's/Lcuwang//g ; s/Gao//g' student.txt
#同时把“Lcuwang”和“Gao”替换为空


8.字符处理

1> sort 排序
语法:sort [选项] 文件名
选项:
-f: 忽略大小写
-n: 以数值型进行排序,默认使用字符串型排序
-r: 反向排序
-t: 指定分隔符,默认是分隔符是制表符
-k n[,m]: 按照指定的字段范围排序。从第n字段开始, m字段结束(默认到行尾)
示例:
sort /etc/passwd
#排序用户信息文件

sort -r /etc/passwd
#反向排序

sort -t ":" -k 3,3 /etc/passwd
#指定分隔符是“:”,用第三字段开头,第三字段结尾排序,就是只用第三字段排序

2> wc 统计
语法:wc [选项] 文件名
选项:
-l: 只统计行数
-w: 只统计单词数
-m: 只统计字符数


9.条件判断

1> 按照文件类型进行判断,如下图




a> 两种判断格式
test -e /root/install.log
[ -e /root/install.log ]
示例:
[ -d /root ] && echo "yes" || echo "no"
#第一个判断命令如果正确执行,则打印“yes”,否则打印“no

2> 按照文件权限进行判断,如下图




[ -w student.txt ] && echo "yes" || echo "no"
#判断文件是拥有写权限的

3> 两个文件之间进行比较,如下图




ln /root/student.txt /tmp/stu.txt
#创建个硬链接

[ /root/student.txt -ef /tmp/stu.txt ] && echo "yes" || echo "no"
yes
#用test测试下

4> 两个整数之间进行比较,如下图




[ 23 -ge 22 ] && echo "yes" || echo "no"
yes
#判断23是否大于等于22

[ 23 -le 22 ] && echo "yes" || echo "no"
no
#判断23是否小于等于22

5> 字符串的判断,如下图




name=qq
#给name变量赋值
[ -z "$name" ] && echo "yes" || echo "no"
no
#判断name变量是否为空,因为不为空,所
以返回no

aa=11
bb=22
#给变量aa和变量bb赋值
[ "$aa" == "bb" ] && echo "yes" || echo "no"
no
#判断两个变量的值是否相等,明显不相等所以返回no

6> 多重条件的判断,如下图




aa=11
[ -n "$aa" -a "$aa" -gt 23 ] && echo "yes" || echo "no"
no
#判断变量aa是否有值,同时判断变量aa的是否大于23
#因为变量aa的值不大于23,所以虽然第一个判断值为真,返回的结果也是假

aa=24
[ -n "$aa" -a "$aa" -gt 23 ] && echo "yes" || echo "no"
yes


10.流程控制

1> if语句
a> 单分支
if [ 条件判断式 ];then
程序
fi
或者
if [ 条件判断式 ]
then
程序
fi

注意事项:
 if语句使用fi结尾,和一般语言使用大括号结尾不同
 [ 条件判断式 ]就是使用test命令判断,所以中括号和条件判断式之间必须有空格
 then后面跟符合条件之后执行的程序,可以放在[]之后,用“;”分割。也可以换行写入,就不需要“;”了

示例:判断分区使用率

vim if.sh

######################################
# Author     :lcuwang                #
# Create Date:2017-12-29             #
# Email      :lcuwang@163.com        #
# Version    :1.0                    #
# Description:  统计根分区使用率     #
######################################

#!/bin/bash
rate=$(df -h | grep "/dev/sda1" | awk '{print $5}' | cut -d "%" -f1)
#把根分区使用率作为变量值赋予变量rate
echo $rate
if
[ $rate -ge 5 ]
then
echo "Warning! /dev/sda1 is full!!"
fi

b> 双分支
if [ 条件判断式 ]
then
条件成立时, 执行的程序
else
条件不成立时, 执行的另一个程序
fi

示例:判断apache是否启动

vim apache.sh

######################################
# Author     :lcuwang                #
# Create Date:2017-12-29             #
# Email      :lcuwang@163.com        #
# Version    :1.0                    #
# Description: 判断apache是否启动     #
######################################

#!/bin/bash
port=$(nmap -sT 192.168.174.135 | grep tcp | grep http | awk '{print $2}')
#使用nmap命令扫描服务器, 并截取apache服务的状态, 赋予变量port
if [ "$port" == "open" ]
then
echo “$(date) httpd is ok!” >> /tmp/autostart-acc.log
else
/etc/rc.d/init.d/httpd start &>/dev/null
echo "$(date) restart httpd !!" >> /tmp/autostart-err.log
fi

c> 多分支
if [ 条件判断式1 ]
then
当条件判断式1成立时, 执行程序1
elif [ 条件判断式2 ]
then
当条件判断式2成立时, 执行程序2
...省略更多条件...
else
当所有条件都不成立时, 最后执行此程序
fi

示例:
######################################
# Author     :lcuwang                #
# Create Date:2017-12-29             #
# Email      :lcuwang@163.com        #
# Version    :1.0                    #
# Description: 输入文件判断          #
######################################

#!/bin/bash

read -p "Please input a filename:"  file
#接收键盘的输入,并赋予变量file
if [ -z $file ]
#判断变量是否为空
then
echo "ERROR, Please input a filename"
exit 1
elif [ ! -e "$file" ]
#判断file的值是否存在
then
echo "Your input is not a file"
elif [ -f $file ]
#判断file是否为普通文件
then
echo "$file is a regulare file"
elif [ -d "$file" ]
#判断file的值是否为目录文件
then
echo "$file is a directory"
else
echo "$file is an other file!"
fi

2> case语句

case语句和if…elif…else语句一样都是多分支条件语句,不过和if多分支条件语句不同的是,
case语句只能判断一种条件关系,而if语句可以判断多种条件关系

语法:
case $变量名 in
"值1")
如果变量的值等于值1, 则执行程序1
;;
"值2")
如果变量的值等于值2, 则执行程序2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值, 则执行此程序
;;
esac

示例:
######################################
# Author     :lcuwang                #
# Create Date:2017-12-29             #
# Email      :lcuwang@163.com        #
# Version    :1.0                    #
# Description: case语句              #
######################################

#!/bin/bash
read -p "Please choose yes/no:" -t 30 cho

case $cho in
"yes")
echo "Your choose is yes!"
;;
"no")
echo "Your choose is no!"
;;
*)
echo "Your choose is error!"
esac

3> for循环
语法一:
for 变量 in 值1 值2 值3…
do
程序
done

示例:
######################################
# Author     :lcuwang                #
# Create Date:2017-12-29             #
# Email      :lcuwang@163.com        #
# Version    :1.0                    #
# Description:  for循环              #
######################################

#!/bin/bash
for time in morning noon afternoon evening
do
echo "This time is $time!"
done

#批量解压缩文件
cd /lamp
ls *.tar.gz > ls.log
for i in $(cat ls.log)
do
tar -zxf $i &>/dev/null
done
rm -rf /lamp/ls.log

语法二:
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done

示例:
######################################
# Author     :lcuwang                #
# Create Date:2017-12-29             #
# Email      :lcuwang@163.com        #
# Version    :1.0                    #
# Description: 从1加到100           #
######################################

#!/bin/bash
s=0
for (( i=0;i<=100;i++ ))
do
s=$(( $s+$i ))
done

echo "The sum 1+2+3+...+100 is:$s"

4> while循环

a> while循环
while循环是不定循环,也称作条件循环。只要条件判断式成立,循环就会一直继续,
直到条件判断式不成立,循环才会停止。 这就和for的固定循环不太一样了。

语法:

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

示例:

######################################
# Author     :lcuwang                #
# Create Date:2017-12-29             #
# Email      :lcuwang@163.com        #
# Version    :1.0                    #
# Description: while循环             #
######################################

#!/bin/bash
i=1
s=0
while [ $i -le 100  ]
do
i=$(( $i+1  ))
s=$(( $s+$i  ))
done
echo "The number is $s"

b> until循环
until循环,和while循环相反, until循环时只要条件判断式不成立则进行循环,并执行循环程序。
一旦循环条件成立,则终止循环。

示例:

######################################
# Author     :lcuwang                #
# Create Date:2017-12-29             #
# Email      :lcuwang@163.com        #
# Version    :1.0                    #
# Description: until循环             #
######################################

#!/bin/bash
i=1
s=0
until [ $i -gt 100  ]
do
i=$(( $i+1  ))
s=$(( $s+$i  ))
done
echo "The number is $s"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: