Linux - Shell编程 - if判断、for循环、while循环
一、第一个shell脚本
1、什么是shell
Shell 是操作系统的最外层,Shell 可以合并编程语言以控制进程和文件,以及启动和控制其它程序。shell 通过提示输入,向操作系统解释该输入,然后处理来自操作系统的任何结果输出来管理您与操作系统之间的交互。简单来说Shell 就是一个用户跟操作系统之间的一个命令解释器。
Shell 是用户与 Linux 操作系统之间沟通的桥梁。用户可以输入命令执行,又可以利用 Shell 脚本编程去运行。
2、shell的种类
Linux Shell 种类非常多,常见的有:
Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh)等。
不同的 Shell 语言的语法有所不同,所以不能交换使用
最常用的shell是 Bash,也就是 Bourne Again Shell,由于易用和免费,Bash 在日常工作中被广泛使用,也是大多数 Linux 系统默认的 Shell。
接下来我们来写一个简单的 shell 脚本。(shell 脚本一般文件名以.sh 结尾,同时文件第一行定义该脚本为 shell 脚本)
3、第一个shell脚本
执行:vi first_shell.sh
输入: #!/bin/bash #This is my First shell echo "Hello world"
保存退出,shell脚本写入完成
输入命令执行:
编辑模式输入:
然后执行:
解释:
#! /bin/bash 表示定义该脚本是一个 shell 脚本(固定格式)。 #This is my First shell 这里的#号属于注解,没有任何的意义,shell 不会解析它。 echo "Hello world" shell 脚本主命令,我们执行这个脚 本讲看到: Hello World 信息。 脚本编写完毕,如何来执行呢,首先执行 shell 脚本需要执行权限,赋予执行权限:chmod o+x first_shell.sh 然后执行:./first_shell.sh 也可以直接使用bash环境命令执行: /bin/sh first_shell.sh,显示效果一样。
二、shell编程之变量
1、定义
Shell 编程语言是非类型的解释型语言,不像 C++/JAVA 语言编程时需要事先声明变量,shell 给一个变量赋值,实际上就是定义了变量,在Linux支持的所有shell中,都可以用赋值符号(=)为变量赋值。SHELL 变量可分为两类:局部变量和环境变量。局部变量只在创建它们的 shell 脚本中使用。而环境变量则可以在创建它们的 shell及其派生出来的任意子进程中使用。有些变量是用户创建的,其他的则是专用 shell 变量。
例如在脚本里面定义 A=123 ,定义这样一个变量,前面变量名,后面是变量的值。
2、例子
引用变量可以使用$A,把变量放在脚本里面会出现什么样的效果呢? 如下
#!/bin/bash #by authors zgs 2020 name=zgs echo "My name is $name" 执行脚本:sh var.sh,结果将会显示:My name is zgs
简单的理解变量,相当于定义一个别名-名称,引用的时候加上$符号就可以了。
shell 常见的系统变量解析:
$0 :当前程序的名称 $n :当前程序的第 n 个参数,n=1,2,…9 $* :当前程序的所有参数(不包括程序本身) $# :当前程序的参数个数(不包括程序本身) $? :上个命令是否执行成功,0 表示执行成功。不是0表示执行失败 $UID :当前用户的 ID $PWD :当前所在的目录
例如:
三、if语句
1、判断数字大小
if (表达式) ;then 语句 1 else 语句 2 fi
如:
2、判断目录是否存在
#! /bin/bash #auto if test #by authors zgs 2020 DIR=/tmp/20200604 if [ ! -d $DIR ];then mkdir -p $DIR echo -e "\033[32mThis $DIR Create success.\033[0m" else echo -e "\033[32mThis $DIR is exist, please exit.\033[0m" fi
如:
3、判断文件是否存在
#! /bin/bash #auto test files #by authors zgs 2020 FILES=/tmp/text.txt if [ ! -f $FILES ];then echo "OK" >> $FILES else cat $FILES fi
如:
逻辑运算符解析:
-f 判断文件是否存在 eg: if [ -f filename ] -d 判断目录是否存在 eg: if [ -d dir ] -eq 等于 应用于:整型比较 -ne 不等于 应用于:整型比较 -lt 小于 应用于:整型比较 -gt 大于 应用于:整型比较 -le 小于或等于 应用于:整型比较 -ge 大于或等于 应用于:整型比较 -a 双方都成立(and) 逻辑表达式 –a 逻辑表达式 -o 单方成立(or) 逻辑表达式 –o 逻辑表达式 -z 空字符串
4、多个条件判断
#! /bin/bash #auto test scores #by authors zgs 2020 scores=$1 if [ -z $scores ];then echo "usage:{$0 60|80}" exit fi if [[ $scores -gt 85 ]]; then echo "very good!"; elif [[ $scores -gt 75 ]]; then echo "good!"; elif [[ $scores -gt 60 ]]; then echo "pass!"; else echo "no pass!" fi
如:
5、if条件语句年写Mysql备份脚本
6、一键源码安装 LAMP 脚本
功能: 打印菜单: 1)安装 apache WEB 服务器 2)安装 Mysql DB 服务器 3)安装 PHP 服务器 4)整合 LAMP 架构并启动服务 1、Apache 服务器安装部署。 下载 httpd-2.2.27.tar.gz 版本,下载 URL,解压,进入安装目录, configure;make ;make install 2、Mysql 服务器的安装。 下载 mysql-5.5.20.tar.bz2 版本,下载 URL,解压,进入安装目录, configure;make ;make install 3、PHP 服务器安装。 下载 php-5.3.8.tar.bz2 版本,下载 URL,解压,进入安装目录, configure;make ;make install 4、LAMP 架构的整合和服务启动。
执行命令:sh auto_lamp1.sh 1,则下载安装Apache
4、for循环
for 变量 in 字符串 do 语句 1 done
案例一:打印 seq 数字循环
#!/bin/sh for i in `seq 15` do echo 'NUM is $i' done
案例二:求和 1-100 的值
#!/bin/bash #auto sum 1 100 j=0 for ((i=1;i<=100;i++)) do j=`expr $i + $j` done echo $j
查看脚本执行的过程:
案例三:找到相关 log,然后批量打包
#!/bin/sh for i in `find /var/log -name '*.log'` do tar –czf 2014log.tgz $i done
find /var/log -name '*.log':查看指定目录下以log结尾的文件
如:
解压:
案例四:远程主机批量传输文件
#!/bin/bash #auto scp files for client #by authorszgs 2020 for i in `seq 100 200` do scp -r /tmp/test.txt root@192.168.1.$i:/data/webapps/www done
5、while循环
while 条件语句 do 语句 1 done
1、案例一:while 条件判断数字
#!/bin/sh i=1; while [[ $i -lt 10 ]];do echo $i; ((i++)); done;
案例二:扩展讲解 linux read 命令
read -p "Please input number:" input
案例三:while 逐行读取某个文件
#!/bin/sh while read line do echo $line; done < /etc/hosts
六、until循环
until 条件 do action done 直到满足条件,才退出。否则执行 action。
案例一:条件判断数字
#!/bin/sh a=10; until [[ $a -lt 0 ]];do echo $a; ((a--)); done;
如:
七、case选择语句
case $arg inpattern1) 语句 1 ;; pattern2) 语句 2 ;; *) 语句 3 ;; esac
八、select 选择语句
select 一般用于选择菜单的创建,可以配合 PS3 来做菜单的打印输出信息。
#!/bin/sh PS3="What you like most of the open source system?" select i in CentOS RedHat Ubuntu do echo "Your Select System: "$i Done
如: