======输入输出练习=======
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 当前脚本的文件名
n传递给脚本或函数的参数。n是一个数字,表示第几个参数。例如,第一个参数是 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\n”echo−e“theresultlis 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
#!/bin/bash ansible自动化运维工具
#if else test
#by author Mr.Xue 2017
Num1=100
Num2=200
if [ Num1−lt Num2 ];then
echo “ Num1> Num2”
else
echo “ Num1< Num2”
fi
#create dir
DIR=/tmp/2017
if [ ! -d DIR];thenmkdir−p DIR
echo -e “\033[34m DIR创建成功\033[0m”elseecho−e“\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 闪烁
#!/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:/optssh−lroot192.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
#!/bin/bash
sum=0
for I in {1..50};
do
sum= (( sum+2* I))doneecho“thesumis 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 [[ i−lt10]]doecho“ i”
((i++))
done
while逐行读取文件:
while read line
do
echo “$line”
done < /etc/hosts
#!/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
# UID获取当前用户shellID,0表示root用户if[[ UID -ne 0 ]]; then
echo “Must to be use root for exec shell.”
exit
fi
if [[ ! -d BACKDIR]];thenmkdir−p BACK_DIR
echo -e “\033[32mThe BACKDIRcreatesuccessfully!\033[0m”elseecho−e“\033[32mThe BACK_DIR is exits…\033[0m”
fi
#备份数据库命令
MYSQLCMD−u MYSQLUSER -p MYSQLPWD MYSQLDB > / BACKDIR/ MYSQLDB.sql
if [[ ?−eq0]];thenecho−e“\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]];thenecho−e“ MYSQL_BACK_DIR is exits…”
else
mkdir -p MYSQLBACKDIRecho−e“ MYSQL_BACK_DIR create successfully!”
#备份数据库
MYSQLCMD−u MYSQLUSER -p MYSQLPWD MYSQLDB > / MYSQLBACKDIR/ MYSQLDB.sql
if [[ ?−eq0]];thenecho−e“\033[32mTheMysqlBackup MYSQLDB successfully!\033[0m”
else
echo -e “\033[32m The Mysql Backup $MYSQLDB failed!\033[0m”
fi