shell脚本学习

shell基础语法

======输入输出练习=======
1、创建test_echo.sh
2、vim test_echo.sh
!/bin/sh
echo “hello world,世界”

read input
echo “login:”
read uname
echo “passwd:”
read pwd
echo “Hello, uname, pwd”
3、chmod +x test_echo.sh
4、./test_echo.sh

======Shell变量的定义、删除变量、只读变量、变量类型======
!/bin/sh
定义变量:首字母a-z,A-Z;中间不能有空格;不能使用下划线_
name=”zhangsan”

使用变量(2种)
echo nameecho {name}

设置只读变量
readonly name
name=”lisi”

删除变量
unset name
echo $name


变量类型
运行shell时,会同时存在三种变量:
1) 局部变量

局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
2) 环境变量

所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
3) shell变量

shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
===Shell特殊变量:Shell 0, #, , @, ?, === 0 当前脚本的文件名
nn 1,第二个参数是 2 # 传递给脚本或函数的参数个数。
@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 ? 上个命令的退出状态,或函数的返回值。成功0,失败1
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。

—-vim test_param.sh——

#!/bin/sh
#show shell name
echo 0echo 1
echo #  
echo
*
echo @echo ?
echo $$

—–./test_param.sh 123 456——

=====Shell替换:Shell变量替换,命令替换,转义字符=====
转义字符 含义
\ 反斜杠
\a 警报,响铃
\b 退格(删除键)
\f 换页(FF),将当前位置移到下页开头
\n 换行
\r 回车
\t 水平制表符(tab键)
\v 垂直制表符

——举例:-e 对转义字符进行转换—

#!/bin/sh
a=10
echo “the result is a\nechoetheresultlis a \n”
—-执行结果如下—–
the result is 10 \n
the resultl is 10


=====命令替换commond===(ESC按键下边的字符)===


#!/bin/sh
#替换命令
DATE=date
echo “Data is $DATE”

FILES=ls -a
echo “Logined in user are $FILES”

UP=date ; uptime
echo “Uptie is $UP”


===================

echo -e “\033[32m please select one:\033[1m”
echo -e “\033[32m 1)install Mariadb\033[1m”
echo -e “\033[32m 2)install tomcat\033[1m”
echo -e “\033[32m 3)install nginx\033[1m”

echo -e “\033[0m”
selectIndex


if判断

#!/bin/bash ansible自动化运维工具
#if else test
#by author Mr.Xue 2017
Num1=100
Num2=200
if [ Num1lt Num2 ];then
echo “ Num1> Num2”
else
echo “ Num1< Num2”
fi

#create dir
DIR=/tmp/2017
if [ ! -d DIR];thenmkdirp DIR
echo -e “\033[34m DIR\033[0melseechoe\033[35m DIR 存在\033[0m”
fi

========参考Shell脚本IF条件.html===============
[root@localhost opt]# /bin/bash -n test.sh ——–测试脚本是否存在语法问题
语法:
if [[]]; then elif/if [[]] ; then else fi

注:
1、if中(())用于判断大小等条件,可以用> <

2、条件判断符号[]
[和]前后都要有空格,表达式之间有空格
if [ str1 = str2 ]      当两个串有相同内容、长度时为真
if [ str1 != str2 ]      当串str1和str2不等时为真
if [ -n str1 ]       当串的长度大于0时为真(串非空)
if [ -z str1 ]        当串的长度为0时为真(空串)
if [ str1 ]         当串str1为非空时为真
-a 与
-o 或
! 非
exit 退出脚本

[]可用的比较运算符只有==和!=,两者都是用于字符串比较的,不可用于整数比较,整数比较只能使用-eq,-gt这种形式。
[]中的逻辑与和逻辑或使用-a 和-o 表示。“&&”与“||”都是无法使用的。
在[]判断中的常量都最好使用单引号或者双引号括起来,而变量最好使用双引号括起来。

括号“[]”判断时“==”与“=”的结果是一样的.

3、
[[是 bash 程序语言的关键字。并不是一个命令,[[ ]] 结构比[ ]结构更加通用。在[[和]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换。
支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。
使用[[ … ]]条件判断结构,而不是[ … ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。
bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。


#!/bin/bash
#show LNMP menu
#by authors Mr.Xue 2017

echo -e “\033[32m Please select Menu follow:\033[1m”

echo “1)安装Tomcat服务器”
echo “2)安装MySQL服务器”
echo “3)安装Nginx服务器”
echo “4)安装LVS服务器”

echo -e “\033[32m————————-\033[0m”

===================================================
注:
echo -e “\033[32m Please select Menu follow:\033[1m”
32m—字的颜色,范围是30~37
\33[0m 关闭所有属性
\33[1m 设置高亮度
\33[4m 下划线
\33[5m 闪烁

shell - 多主机文件传输、远程任务执行

#!/bin/bash
#auto scp files for client
#by author Mr.Xue 2017
#for i in echo 192.168.186.130 192.168.186.131

for i in seq 130 133
do
scp -r /opt/test1.sh [email protected]. i:/optsshlroot192.168.186. i ‘touch /opt/a.txt’
done


作业:接收参数传输
答案:
#!/bin/bash
#auto scp files for client
#by author Mr.Xue 2017
FILES= if[[z * ]];then
echo -e “\033[32mPlease Use{$0 /filesname}\033[0m”
exit
fi

for i in seq 130 133
do
scp -r FILESroot@192.168.186. i:/opt/
done


运行:./auto_scp.sh test1.sh test2.sh

shell - for循环求100以内偶数和

#!/bin/bash
sum=0
for I in {1..50};
do
sum= (( sum+2* I))doneechothesumis sum”

===========================================
注:

第一类:数字性循环

for1-1.sh
#!/bin/bash

for((i=1;i<=10;i++));
do
echo (expr i * 3 + 1);
done


for1-2.sh
#!/bin/bash

for i in (seq110)doecho (expr $i * 3 + 1);
done


for1-3.sh
#!/bin/bash

for i in {1..10}
do
echo (expr i * 3 + 1);
done


for1-4.sh
#!/bin/bash

awk ‘BEGIN{for(i=1; i<=10; i++) print i}’

第二类:字符性循环

for2-1.sh
#!/bin/bash

for i in ls;
do
echo $i is file name! ;
done


for2-2.sh
#!/bin/bash

for i in ;doecho i is input chart! ;
done


for2-3.sh
#!/bin/bash

for i in f1 f2 f3 ;
do
echo $i is appoint ;
done


for2-4.sh
#!/bin/bash

list=”rootfs usr data data2”
for i in list;doecho i is appoint ;
done

第三类:路径查找

for3-1.sh
#!/bin/bash

for file in /proc/*;
do
echo $file is file path ! ;
done


for3-2.sh
#!/bin/bash

for file in (ls.sh)doecho file is file path ! ;
done


#/bin/bash
#while
#by author Mr.Xue
#while (( $i < 10 ))

i=0
while [[ ilt10]]doecho i”
((i++))
done


while逐行读取文件:
while read line
do
echo “$line”
done < /etc/hosts


shell - if编写mysql自动备份脚本

#!/bin/bash
#auto backup mysql
#by author Mr.Xue 2017

#年月日 时间毫秒值
BACK_DIR=/data/backup-mysql/date +%Y%m%d%s
MYSQLDB=mysql
MYSQLUSER=root
MYSQLPWD=123456
MYSQLCMD=/usr/bin/mysqldump

# UIDshellID0rootif[[ UID -ne 0 ]]; then
echo “Must to be use root for exec shell.”
exit
fi

if [[ ! -d BACKDIR]];thenmkdirp BACK_DIR
echo -e “\033[32mThe BACKDIRcreatesuccessfully!\033[0melseechoe\033[32mThe BACK_DIR is exits…\033[0m”
fi

#备份数据库命令
MYSQLCMDu MYSQLUSER -p MYSQLPWD MYSQLDB > / BACKDIR/ MYSQLDB.sql

if [[ ?eq0]];thenechoe\033[32mTheMysqlBackup MYSQLDB successfully!\033[0m”
else
echo -e “\033[32mThe Mysql Backup $MYSQLDB failed!\033[0m”
fi

=====================================================================
注:
crontab 定期执行脚本命令
* * * * * command ——–分 时 日 月 周 命令

[root@localhost opt]# crontab -e
0 0 * * * /bin/bash /opt/test4.sh >> /tmp/mysql_bak.log

查询任务:
crontab -l -u root


shell - if编写mysql自动备份脚本:
#!/bin/bash
#function:backup mysql

MYSQL_BACK_DIR=/data/backup-mysql/date +%Y%m%d%s
MYSQLDB=mysql
MYSQLUSER=root
MYSQLPWD=123456
MYSQLCMD=/usr/bin/mysqldump

if [[ -d MYSQLBACKDIR]];thenechoe MYSQL_BACK_DIR is exits…”
else
mkdir -p MYSQLBACKDIRechoe MYSQL_BACK_DIR create successfully!”

#备份数据库
MYSQLCMDu MYSQLUSER -p MYSQLPWD MYSQLDB > / MYSQLBACKDIR/ MYSQLDB.sql
if [[ ?eq0]];thenechoe\033[32mTheMysqlBackup MYSQLDB successfully!\033[0m”
else
echo -e “\033[32m The Mysql Backup $MYSQLDB failed!\033[0m”
fi

你可能感兴趣的:(环境部署,linux)