Shell基础语法

IF语句

1. 表达式

if (表达式) 

	语句1

else

	语句2

fi

2. 比较两个整数大小

#!/bin/bash
#By author jfedu.net 2017
NUM=100
if  (( $NUM > 4 )) ;then 
echo “The  Num  $NUM  more  than 4.”
else
echo “The  Num  $NUM  less   than 4.”
fi

3. 判断系统目录是否存在

\#!/bin/bash

\#judge DIR or Files

\#By author jfedu.net 2017

if [ ! -d /data/20140515 -a ! -d /tmp/2017/ ];then 

mkdir -p /data/20140515

fi

4. If常见判断逻辑运算符详解

-f	 					判断文件是否存在 eg: if [ -f filename ];
-d	 					判断目录是否存在 eg: if [ -d dir     ];
-eq						等于,应用于整型比较 equal;
-ne						不等于,应用于整型比较 not equal;
-lt						小于,应用于整型比较 less than;
-gt						大于,应用于整型比较 greater than;
-le						小于或等于,应用于整型比较;
-ge 					大于或等于,应用于整型比较;
-a						双方都成立(and) 逻辑表达式 –a 逻辑表达式;
-o						单方成立(or) 逻辑表达式 –o 逻辑表达式;
-z						空字符串;
||      				单方成立;
&&      				双方都成立表达式。

5. if多个条件测试分数判断

#!/bin/bash

\#By author jfedu.net 2017

scores=$1

if [[ $scores -eq 100 ]]; then
   echo "very good!";
 elif [[ $scores -gt 85 ]]; then
   echo "good!";
 elif [[ $scores -gt 60 ]]; then
   echo "pass!";
elif [[ $scores -lt 60 ]]; then
   echo "no pass!"
 fi

6. If判断括号区别

在使用if语句时,经常会使用()、(())、[]、[[]]、{}等括号,如下为几种括号简单区别对比:
(  )
用于多个命令组、命令替换、初始化数组;
(( ))
例如:(( $NUM > 4 ))
整数扩展、运算符、重定义变量值,算术运算比较;
[]
例如:[ ! -d /data/20140515 -a ! -d /tmp/2017/ ]
bash内部命令,[与test是等同的,正则字符范围、引用数组元素编号,不支持+-*/数学运算符,逻辑测试使用-a、-o。
[[ ]]
例如:[[ $scores -eq 100 ]]
bash程序语言的关键字,不是一个命令,[[ ]]结构比[ ]结构更加通用,不支持+-*/数学运算符,逻辑测试使用&&、||。
{}
主要用于命令集合或者范围,例如mkdir  -p  /data/201{7,8}/

for循环

0. 1-100的和

#!/bin/bash
j=0
for ((i=1;i<=100;i++))
do
        j=`expr $i + $j`
done
echo $j

1. for循环打印10秒等待

#!/bin/bash
for ((i=1;i<=10;i++))
do
        echo -ne "\033[32m-\033[0m"
        sleep 1

done

2. For循环批量远程主机执行命令

#!/bin/bash
#auto scp files for client
#By author jfedu.net 2017
for i in `seq 100 200`
do
       ssh -l  root 192.168.1.$i ‘ls /tmp’
done

3.备份数据库(可crontab来设置定时备份)

grant zabbix,discuz,wordpress tables on *.* to username@'localhost' identified by "password";

flush privileges;

3.1 备份数据库V1版本(可crontab来设置定时备份)

首先判断数据库备份目录是否存在,不存在创建
导出数据库
判断导出是否成功,进行提示

#!/bin/bash
SQL_DB=zabbix
SQL_USR=root
SQL_PWD=123456
SQL_CMD="/usr/local/mysql55/bin/mysqldump"
SQL_DIR="/opt/sh/`date + %F`"

if [ ! -d $SQL_DIR ];then
        mkdir -p $SQL_DIR
        echo -e "\033[32m The dir $SQL_DIR succeded\033[0m"
fi

$SQL_CMD -u$SQL_USR -p$SQL_PWD $SQL_DB > $SQL_DIR/${SQL_DB}.sql
if [ $? -eq 0 ];then
        echo -e "\033[32m----------------\033[0m"
        echo -e "\033[32mThe mysql ${SQL_DB} database backup succeded\033[0m"
        ls -l $SQL_DIR
else
        echo -e "\033[32m----------------\033[0m"
        echo -e "\033[32mThe mysql ${SQL_DB} database backup filed   \033[0m"
        ls -l $SQL_DIR
fi

3.2 备份数据库V2版本(可crontab来设置定时备份)

循环备份多个数据库(需要手动指定),备份好后显示备份成功的数据库并ls显示
V1和V2的区别是增加了循环备份,可以备份多个数据库

   [root@localhost sh]# ./sql_v2.sh wordpress zabbix

   #!/bin/bash
   SQL_DB="$*"
   SQL_USR=root
   SQL_PWD=123456
   SQL_CMD="/usr/local/mysql55/bin/mysqldump"
   SQL_DIR="/opt/sh/`date +%F`"

   #如果没有指定则提示备份的数据库,也可以写死在脚本,取消互动(V2比V1多的友情提示)
   if [ $# -eq 0 ];then
           echo -e "\033[31m----------------\033[0m"
           echo -e "\033[31mUsage:{/bin/bash $0 discuz|wordpress|zabbix|test}|help}\033[0m"
           exit
   fi

   #判断备份目录是否存在
   if [ ! -d $SQL_DIR ];then
           mkdir -p $SQL_DIR
           echo -e "\033[32m The dir $SQL_DIR succeded\033[0m"
   fi

   #循环备份多个数据库
   for i in $SQL_DB
   do
       #备份数据库语句
       $SQL_CMD -u$SQL_USR -p$SQL_PWD $i > $SQL_DIR/${i}.sql
       if [ $? -eq 0 ];then
               echo -e "\033[32m----------------\033[0m"
               #输出,并将数据库以不同的字体显示
               echo -e "\033[32mThe mysql \033[31m${i}\033[32m database backup succeded\033[0m"
               ls -l $SQL_DIR
       else
               echo -e "\033[32m----------------\033[0m"
               echo -e "\033[32mThe mysql ${i} database backup filed   \033[0m"
               rm -rf $SQL_DIR/${i}.sql
               echo -e "\033[32mls -l $SQL_DIR \033[0m"
               ls -l $SQL_DIR

       fi
   done

结果:
[root@localhost sh]# ./sql_v2.sh wordpress zabbix
The mysql wordpress database backup succeded
total 12364
-rw-r--r-- 1 root root   425768 May 21 20:39 wordpress.sql
-rw-r--r-- 1 root root 12231628 May 21 20:38 zabbix.sql
The mysql zabbix database backup succeded
total 12364
-rw-r--r-- 1 root root   425768 May 21 20:39 wordpress.sql
-rw-r--r-- 1 root root 12233027 May 21 20:39 zabbix.sql

3.3备份数据库V3版本(可crontab来设置定时备份)

SQL_DB="$*"
SQL_USR=root
SQL_PWD=123456
SQL_CMD="/usr/local/mysql55/bin/mysqldump"
SQL_DIR="/opt/sh/`date +%F`"

#判断如何没有参数则提示,V2比V1多的互动(可取消,将备份的数据库写死在脚本中)
if [ $# -eq 0 ];then
        echo -e "\033[31m----------------\033[0m"
        echo -e "\033[31mUsage:{/bin/bash $0 discuz|wordpress|zabbix|test}|help}\033[0m"
        exit
fi

#判断备份目录是否存在,如果不存在则创建
if [ ! -d $SQL_DIR ];then
        mkdir -p $SQL_DIR
        echo -e "\033[32m The dir $SQL_DIR succeded\033[0m"
fi

#判断如果参数为all则备份所有数据库,V3比V2多的内容(备份所有数据库)
if [ $1 == "all" ];then
        $SQL_CMD -u$SQL_USR -p$SQL_PWD --all-databases > $SQL_DIR/${SQL_DB}.sql
        if [ $? -eq 0 ];then
                echo -e "\033[32m------------------\033[0m"
                echo -e "\033[32mThe mysql ${SQL_DB} database backup succeded.\033[0m"
                ls -l $SQL_DIR
                exit
        else
                echo -e "\033[32m ------------------\033[0m"
                echo -e "\033[32mThe mysql ${SQL_DB} database backup failed check\033[0m"
                rm -rf $SQL_DIR/${SQL_DB}.sql
                ls -l $SQL_DIR
                exit
        fi

fi

#备份数据库,使用循环可以备份多个数据库
for i in $SQL_DB
do
#备份数据库语句
$SQL_CMD -u$SQL_USR -p$SQL_PWD $i > $SQL_DIR/${i}.sql
#备份成功后提示成功并输出
if [ $? -eq 0 ];then
        echo -e "\033[32m----------------\033[0m"
        echo -e "\033[32mThe mysql \033[31m${i}\033[32m database backup succeded\033[0m"
        ls -l $SQL_DIR
else
#备份失败后提示失败并输出
        echo -e "\033[32m----------------\033[0m"
        echo -e "\033[32mThe mysql ${i} database backup filed   \033[0m"
        rm -rf $SQL_DIR/${i}.sql
        echo -e "\033[32mls -l $SQL_DIR \033[0m"
        ls -l $SQL_DIR

fi
done

while

语法格式

while  (表达式)
do
	语句1
done

1. 循环打印文件中的内容

#!/bin/bash
while read LINE
do
        echo $LINE
done <aa.txt

[root@localhost sh]# ./while1.sh
aaaaaa
bbbbbb
cccccc
dddddd

2. while无限每秒输出内容

#!/bin/bash
while sleep 1
do
        echo -e "\033[31mhahaha \033[0m"
done

[root@localhost sh]# ./while2.sh
hahaha
hahaha
hahaha

3.循环打印1-100数字,expr用于运算逻辑工具

#!/bin/bash
i=0
while ((i<=100))
do
        echo $i
        #expr后面必须空格
        i=`expr $i + 1`
done

4. 循环求1-100和

#!/bin/bash
sum=0
i=1
while ((i<=100))
do
	sum=`expr $sum + $i`
	i=`expr $i + 1`
	#或者使用((i++)),两个选其一
	#((i++))
done
[root@localhost sh]# ./while4.sh
5050

5. 判断IP输入正确性,简易版

#!/bin/bash
#变量和提示一定要差一个空格,否则无法写入到变量内
read -p "Please enter ip Address,example 192.168.128.1 ip:" IPADDR
echo $IPADDR | grep -v "[Az-Zz]" | grep --color -E "([0-9]{1,3}\.){3}[0-9]{1,3}"
#此处还可以继续判断数字的范围
while [ $? -ne 0 ]
do
        read -p "Please enter ip Address,example 192.168.128.1 ip:" IPADDR
        echo $IPADDR | grep -v "[Az-Zz]" | grep --color -E "([0-9]{1,3}\.){3}[0-9]{1,3}"
        echo "while{$IPADDR}"
done

判断IP数字是否合格
if [ $? -eq 0 ];then
		#将IP中的"."替换为空格,例如:192 168 203 1
		IP=(`echo $IPADDR|sed 's/\./ /g'`)
		IP1=`echo ${IP[0]}`
		IP2=`echo ${IP[1]}`
		IP3=`echo ${IP[2]}`
		IP4=`echo ${IP[3]}`
		if [ $IP1 -gt 0 -a $IP1 -le 255 -a $IP2 -gt 0 -a $IP2 -le 255 -a $IP3 -gt 0 -a $IP3 -le 255 -a $IP4 -gt 0 -a $IP4 -le 255 ];then
			 break;	
		fi
fi

6. 每五秒循环判断/etc/shadow是否被非法修改

#!/bin/bashi=0FILES="/etc/shadow"while (($i<1))do        echo "The Time is `date +%F-%T`"        OLD=`md5sum $FILES | cut -d" " -f 1`        sleep 5        NEW=`md5sum $FILES | cut -d" " -f 1`        if [[ $OLD != $NEW ]];then                echo "The $FILES has been modified."        fidone

CASE语句

语法格式

#!/bin/bash#By author jfedu.net 2017case  $1  in      Pattern1)    语句1     ;;      Pattern2)    语句2    ;;      Pattern3)    语句3    ;;  esac

1. 打印菜单

#!/bin/bashcase $1 in        monitor)                echo "monitor_log"        ;;        archive)                echo "archive_log"        ;;        help)                echo -e "\033[32mUsage:{$0 monitor | archive | help... }\033[0m"        ;;        *)                echo -e "\033[32mUsage:{$0 monitor | archive | help }\033[0m"esac

Shell编程函数

Shell允许将一组命令集或语句形成一个可用块,这些块称为Shell函数,Shell函数的用于在于只需定义一次,后期随时使用即可,无需在Shell脚本中添加重复的语句块,其语法格式以function name(){开头,以}结尾。Shell编程函数默认不能将参数传入()内部,Shell函数参数传递在调用函数名称传递,例如name args1 args2。例:function name (){        command1command2        ........}name args1 args2

1. 创建Nginx软件安装函数,给函数传递参数1

#!/bin/bashH_FILES=nginx-1.18.0.tar.gzH_FILES_DIR=nginx-1.18.0H_URL=http://nginx.org/download/H_PREFIX=/usr/local/apache2/function Nginx_install(){        #install nginx web server        if [[ "$1" -eq 1 ]];then                wget -c $H_URL/$H_FILES && tar -xf $H_FILES && cd $H_FILES_DIR && ./configure --prefix=$H_PREFIX                #下载失败返回为0,下载失败而不是报错所以也会返回0                if [ $? -eq 0 ];then                        make && make install                        echo -e "\n\033[32m---------------------\033[0m"                        echo -e "\033[32mThe $H_FILES_DIR Server Install Success!\033[0m"                else                        echo -e "\033[32mThe $H_FILES_DIR Make or Make install ERROR,Please Check...\033[0m"                        exit 0                fi        fi}Nginx_install 1

2. 创建判断IP函数

#!/bin/bashjudge_ip(){        read -p "Please enter ip Address": IPADDR        echo $IPADDR | grep -v "[Aa-Az]" | grep --color -E "([0-9]{1,3}\.){3}[0-9]{1,3}"}judge_ip

Linux 1 , 1, 1,#, ∗ , *, , , , ,?..的含义

$# 是传给脚本的参数个数
$``0` `是脚本本身的名字
$``1` `是传递给该shell脚本的第一个参数
$``2` `是传递给该shell脚本的第二个参数
$@ 是传给脚本的所有参数的列表
$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过``9``个
$$ 是脚本运行的当前进程ID号
$? 是显示最后命令的退出状态,``0``表示没有错误,其他表示有错误
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值