有学过编程语言的同学们都能够很快入手shell因为基础的字符类型,循环语句与C语言也差不多。以下我们来了解以下新手基础:
1.在学习循环语句之前先了解一些基础的字符信息:
$0、$1、$2、$?、$*、$#
$0 代表sh程序自己,例如: sh auto_system_backup.sh ,那么这里的$0就是auto_system_backup.sh
Usage: { $0 /boot /etc} 这是编程中的提示信息:得到的显示结果是Usage: { auto_system_backup.sh /boot /etc}
$1代表的是执行脚本后面的第一个参数,例如:sh auto_system_backup.sh /ect/ /tmp/ 那么这里的$1就是/ect/ ,自然/tmp/ 是$2
当我们需要选择性的执行某些任务时$1等就会排上用场,例如:上面几张博文中提到的选择备份数据库中就用到了$1
------------------------------------------------------------------------------------------------
if [ -z "$1" ];then
echo -e "\033[32mUsage:\nPlease Enter DataBase that you will backup \n-------------------------------\n\nUsage: { $0 mysql } \033[0m"
exit
fi
-------------------------------------------------------------------------------------------------
$?表示以上命令执行都没有错误,如果没有就返回0,主要用在代码中检查错误,如果有错就提示或者不再执行下面的代码
-------------------------------------------------------------------------------------------------
if [ $?-eq 0 ];then
echo -e "\033[32mThe Mysql Backup $MYSQLDB Successfully!\033[0m"
else
echo -e "\033[32mThe Mysql Backup $MYSQLDB Failed,Please check.\033[0m"
fi
----------------------------------------------------------------------------------------------------
$* 代表的是执行脚本后面的所有参数
------------------------------------------------------------------------------
if [ -z "$*" ];then
echo -e "\033[32mUsage:\nPlease Enter Your Backup Files or Directories\n-------------------------------\n\nUsage: { $0 /boot /etc} \033[0m"
exit
fi
---------------------------------------------------------------------------------
$#表示的是执行脚本后面的所有参数的个数
以下一个脚本dollar.sh可以显示以上的参数效果:
-----------------------------------------
#!/bin/bash#define path variables
#by authors shadow_boy 2017-04-06
echo "#####################"
echo "The \$0 is $0"
echo "The \$1 is $1"
echo "The \$2 is $2"
echo "The \$3 is $3"
echo "The \$? is $?"
echo "The \$* is $*"
echo "The \$# is $#"
-----------------------------------------
执行脚本:sh dollar.sh aaa bbb ccc ddd eee
结果如下:
---------------------------------
2.接下来了解一些基础的逻辑运算符:
-f 判断文件是否存在 eg: if [-f filename]
-d 判断目录是否存在 eg: if [-d dir]
eq 等于 应用于:整型比较
-ne 不等于 应用于:整型比较
-lt 小于 应用于:整型比较
-gt 大于 应用于:整型比较
-le 小于或等于 应用于:整型比较
-ge 大于或等于 应用于:整型比较
-a 双方都成立(and) 逻辑表达式 -a 逻辑表达式
-o 单方成立(or) 逻辑表达式 -o 逻辑表达式
-z 空字符串 :-z "$*" 这里的$*和$1都要以字符的形式出现
------------------------------------
在以上的一些脚本你们也可以看到它们的身影,再仔细看看他们是起了什么效果自然也就知道了。剩下的在以后脚本解析中大家自己去理解
3.循环语句:for if while 等
三个判断语句都是编程中的基础之基础,在逻辑运算中也就是他们之间的互相嵌套来处理。以下给出几个简单的例子:
if语句:
一次判断语句,判断出[]中为0就执行之后的语句
--------------------- if_files_exist00.sh-------------------
#!/bin/bash
#juge dir exist
#fome net 2017
mkdir -p /var/tmp/mulu
else
echo "this dir is exist,please exist......"
fi
-------------------------------------------
以上的代码解释:如果/var/tmp/mulu这个目录不存在我们就创建它如果存在就提示信息,结合上面的$1稍微修改一下它
------------------ if_files_exist01.sh------------------------
#!/bin/bash
#jude dir exist
#fome net 2017
if [ ! -d $1 ];then
mkdir -p $1
else
echo"the dir $1 is exist,please exit....."
fi
---------------------------------------------------------------
sh if_files_exist01.sh/var/tmp/mulu01 --这里执行该脚本就要手动的添加参数了
在以上的脚本中我们还可以再加一个提示信息,提示用户输入参数。也就是判断$1是否为空,这里我就不多写了,自己结合前面的代码修改吧!
elif语句:
-------------------输入的分数判断优劣-----------------------------
#!/bin/bash
#juge scores
#from net 2017
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 -ge 60 ]];then
echo "pass!";
else
echo "no pass!"
fi
------------------------------------------------------
for语句:
多次判断,只要条件成立就一直循环处理
----------------以下的代码是计算1-15相加的总和---------
j=0
for i in `seq 1 15`
do
j=`expr $i + $j` --这里相当于C语言中j=i+j
done
echo $j
---------------------
结果:
[root@localhost tmp]# sh for03.sh
120
---------------------
while语句:
也是多次判断直到条件不成立为止
------------------------------------
#!/bin/bash
i=0
while(( $i < 10 ))
do
echo "the number is $i"
((i++))
done
----------------------------
结果:
----------------------------
select语句:
这语句主要用于选取,并获得选取的值,以下程序运行选取的2那么就会获得$i的值为数组中的第二个
语法结构:
select i in "1" "2" "3";
do
代码。。。。。。。
done
----------------------------------
#!/bin/bash
do
echo "Select you use system:"$i;
done
--------------------------------------
结果:
--------------------------------------
这个select语句大部分时候是结合case语句来处理问题
case语句: 在编写大型自动化脚本中占很重要的地位
---------------------------以下代码主要是用于选择性执行程序代码--------------
#!/bin/bash#auto install LAMP
#from shadow_boy 2017-04-06
apache)
echo "wait install httpd server..."
tar -jxvf httpd-2.2.27.tar.bz2; cd httpd-2.2.27
;;
mysql)
echo "wait install mysql server..."
;;
php)
echo "wait install php server..."
;;
*)
echo -e "\033[32mUsage:{$0 apache|mysql|php|help} \033[0m"
;;
esac
----------------------------------------------------------------------------
我们看看执行效果:
很显然在后面接了参数后就开始执行在该模块下的代码,每个模块下我们可以写任何的shell代码去执行。在后期的大规模服务部署中完全可以将所有代码揉在其中嘛。比如自动安装服务、配置服务,数据库备份、数据库恢复,目录数据同步、版本升级等等。都可以但是为了不要弄的很复杂建议不要写太多的功能在其中。以下结合case和select写一个简单的没有具体执行任务的小脚本:
--------------------------------case01.sh---------------------------------------
#!/bin/bash
#auto install LAMP
#fom net 2017
PS3="Select your will exec Menu:"
select i in "Apache" "Mysql" "PHP"
do
case $i in
Apache)
echo "wait install httpd server..."
tar -jxvf httpd-2.2.27.tar.bz2;cd httpd-2.2.27
;;
Mysql)
echo "wait install mysql server..."
;;
PHP)
echo "wait install php server..."
;;
*)
echo -e"\033[32mUsage:{$0 Apache|Mysql|PHP|help}\033[0m"
;;
esac
done
------------------------------------------------------------------------
由于在每个模块下只有简单的显示代码,我们可以在后期根据自己的需要将代码完善,执行效果如下
很显然这个代码更智能一些,在执行程序后可以提示更多选择,在这个脚本上可以扩展出很多东西从而实现更多的自动化处理。
备注:
例如:
echo -e "\033[41;36m something here \033[0m"
其中41的位置代表底色, 36的位置是代表字的颜色
那些ascii code 是对颜色调用的始末.
\033[ ; m …… \033[0m
字背景颜色范围:40----49
40:黑
41:深红
42:绿
43:黄色
44:蓝色
45:紫色
46:深绿
47:白色
字颜色:30-----------39
30:黑
31:红
32:绿
33:黄
34:蓝色
35:紫色
36:深绿
37:白色
===============================================ANSI控制码的说明
\33[0m 关闭所有属性
\33[1m 设置高亮度
\33[4m 下划线
\33[5m 闪烁
\33[7m 反显
\33[8m 消隐
\33[30m -- \33[37m 设置前景色
\33[40m -- \33[47m 设置背景色
\33[nA 光标上移n行
\33[nB 光标下移n行
\33[nC 光标右移n行
\33[nD 光标左移n行
\33[y;xH设置光标位置
\33[2J 清屏
\33[K 清除从光标到行尾的内容
\33[s 保存光标位置
\33[u 恢复光标位置
\33[?25l 隐藏光标
\33[?25h 显示光标