shell脚本学习

来源:互联网 发布:淘宝章鱼哥代购靠谱吗 编辑:程序博客网 时间:2024/06/06 04:30

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 当前脚本的文件名
nn1,第二个参数是2# 传递给脚本或函数的参数个数。
@传递给脚本或函数的所有参数。被双引号(" ")包含时,与 ? 上个命令的退出状态,或函数的返回值。成功0,失败1
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。

—-vim test_param.sh——

#!/bin/sh
#show shell name
echo 0echo1
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\nechoetheresultlisa \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 [ Num1ltNum2 ];then
echo “Num1>Num2”
else
echo “Num1<Num2”
fi

#create dir
DIR=/tmp/2017
if [ ! -d DIR];thenmkdirpDIR
echo -e “\033[34mDIR\033[0melseechoe\033[35mDIR 存在\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 root@192.168.186.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))doneechothesumissum”

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

第一类:数字性循环

for1-1.sh
#!/bin/bash

for((i=1;i<=10;i++));
do
echo (expri * 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 (expri * 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 ;doechoi 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;doechoi 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)doechofile is file path ! ;
done


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

i=0
while [[ ilt10]]doechoi”
((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]];thenmkdirpBACK_DIR
echo -e “\033[32mThe BACKDIRcreatesuccessfully!\033[0melseechoe\033[32mTheBACK_DIR is exits…\033[0m”
fi

#备份数据库命令
MYSQLCMDuMYSQLUSER -pMYSQLPWDMYSQLDB > /BACKDIR/MYSQLDB.sql

if [[ ?eq0]];thenechoe\033[32mTheMysqlBackupMYSQLDB 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]];thenechoeMYSQL_BACK_DIR is exits…”
else
mkdir -p MYSQLBACKDIRechoeMYSQL_BACK_DIR create successfully!”

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

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机淘宝商家老打骚扰电话怎么办 手机上查询详单忘记服务密码怎么办 淘宝上的东西买过就找不到了怎么办 刚刚开的淘宝企业店没有流量怎么办 有图片怎么在淘宝找不到商品怎么办 白色高跟鞋鞋面磨脏了怎么办弄干净 我跟鞋后跟磨烂的脚怎么办? 内衣买回来有一股刺鼻的味道怎么办 裁剪袖子开口偏了1公分怎么办 对于这乱扔垃圾不听劝者该怎么办 感觉被南通蒲公英店铺骗了怎么办 6个月宝宝吃米粉不吃奶怎么办 十个月的宝宝不吃辅食怎么办 5个月宝宝拉肚子有泡沫怎么办 生完孩子后皮肤暗黄怎么办 开服装店批发服装的吊牌怎么办 天虹的鞋一天就坏了怎么办 车被钥匙划了露底漆了怎么办 数控铣z轴回不了参考点怎么办 白色衣服被黑色衣服染了怎么办 夏天出汗衣服粘身上都是毛毛怎么办 支付宝租的手机坏了怎么办 新买的衣服布料扎人怎么办 洗衣服的时候卫生纸沾裤子上怎么办 洗衣服给白衣服染上色了怎么办 不小心喝了游泳池的水怎么办 铁水中硅的含量高了怎么办 视频拍摄单人变双人是怎么办的 四季青进来的货比淘宝还贵怎么办 淘宝还没收货价格买贵了怎么办 在微信上赌博庄跑了怎么办 微信赌博输了10000多怎么办 欠了信用卡说来来家里调查怎么办 没用过的超市购物卡丢了怎么办 体验服抢号成功手机号填错了怎么办 起亚kx3一键启动钥匙没电怎么办 逆战下载的时候显示文件损坏怎么办 移动公司买手机送话费套路怎么办 开通京东白条身份信息被占用怎么办 丰巢快递柜把东西寄丢了怎么办? 圆通快递把我寄的东西弄丢了怎么办