简介
类似于解释器,解释给Linux内核。
国内一般都是bash,
执行方式:可以chmod 加权限直接运行shell文件,也可以不加权限直接 sh XXX.sh 运行,两种方法都是可以的。
shell的变量 自定义变量
(反引号是键盘1左侧的~按键。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 A=100 echo $A echo A=$A echo "A=$A " unset Aecho A=$A readonly B=2echo B=$B unset BC=`date ` D=$(date ) echo "C=$C " echo "D=$D " 100 A=100 A=100 A= B=2 var.sh: 第 14 行:unset : B: 无法取消设定: 只读 variable C=2022年 01月 15日 星期六 13:39:41 EST D=2022年 01月 15日 星期六 13:39:41 EST
环境变量
在/etc/profile 里export 一个全局变量,然后输出。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 vim /etc/profile export MYSQL_HOME=/usr/bin/mysql source /etc/profile:<<! 多行注释 多行注释 多行注释 ! echo MYSQL_HOME=$MYSQL_HOME MYSQL_HOME=/usr/bin/mysql
位置参数变量
写一个脚本position.sh,在此脚本中获取到命令行的各个参数信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 echo "0=$0 1=$1 2=$2 " echo $*echo "$@ " echo $# sh position.sh 100 200 300 400 0=./position.sh 1=100 2=200 100 200 300 400 100 200 300 400 4
预定义变量(用的不多)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 echo "当前执行的进程id=$$" /root/shcode/position.sh & echo "后台最后一个运行的进程id=$!" echo "执行的结果是$?" 当前执行的进程id =26947 后台最后一个运行的进程id =26948 执行的结果是0 [root@localhost shcode] 0
运算符
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 RES1=$(((2 +3 )*4 )) echo "res1=$RES1 " RES2=$[(2+3)*4] echo "res2=$RES2 " TEMP=`expr 2 + 3` RES3=`expr $TEMP \* 4` echo "temp=$TEMP " echo "res3=$RES3 " SUM=$[$1 +$2 ] echo "参数和是 $SUM " ~ ~ res1=20 res2=20 temp=5 res3=20 参数和是 70
条件判断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 if [ "ok" = "ok" ]then echo "equal" fi if [ 23 -ge 22 ]then echo "大于等于" fi if [ -f /root/shcode/aaa.txt ]then echo "存在" fi if [ aaa.txt ] then echo "hello aaa.txt" fi equal 大于等于 存在 hello aaa.txt
流程控制 if 1 2 3 4 5 6 7 8 9 10 11 12 13 if [ 条件判断式 ]then 代码 fi if [ 条件判断式 ]then 代码 elif [ 条件判断式 ]then 代码 ... fi
case 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 case $1 in "1" )echo "周一" ;; "2" )echo "周二" ;; *) echo "other" esac 周一/周二/other
for 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 for i in "$*" do echo "num is $i " done echo "=========" for j in "$@ " do echo "num is $j " done SUM=0 for (( i=1; i<=5; i++ )) do SUM=$[$SUM +$i ] done echo "sum = $SUM " num is 100 200 300 ========= num is 100 num is 200 num is 300 sum = 15
while 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 while 条件/命令do 循环体 done SUM=0 i=0 while [ $i -le $1 ]do SUM=$[$SUM +$i ] i=$[$i +1] done echo "SUM is $SUM " SUM is 55 while 命令do 循环体 done < 文件名 or > 文件名oldIFS=$IFS IFS=":" while read username var do echo "用户名:$username " done < /etc/passwd IFS=$oldIFS '' '熟悉/etc/passwd文件结构的朋友都知道这个文件的每一行包含了一个用户的大量信息(用户名只是第一项)。 这里我们实际只输出了用户名。但是注意while的read后面除变量username外还有个var,尽管我们并不输出这个变量的值。 但它却必不可少,如果我们写成while read username那么username的值等于passwd文件这一整行的内容(IFS=”:”也就不起作用了) ' '' while date do ping -c5 192.168.1.101 >/dev/null 2>&1 if [ $? = 0 ];then echo OK else echo FAIL fi sleep 600 done > ping.txt2015年 01月 31日 星期六 16:03:13 CST OK
read 读取控制台输入。
1 2 3 4 5 6 7 8 9 10 11 12 13 read -p "请输入一个数NUM1:" NUM1echo "你输入的数是$NUM1 " read -t 10 -p "请在10s内输入一个数:" NUM2echo "你输入的数是$NUM2 " 请输入一个数NUM1:1 你输入的数是1 请在10s内输入一个数:你输入的数是
shell的函数 系统函数 韩介绍了两个,和别的编程语言大同小异,其实大家 查查文档就好。
1 2 3 4 5 basename /home/my/test.txtbasename /home/my/test.txt .txt
1 2 3 dirname /home/my/hello.txt
自定义函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 function GetSum () { SUM=$[$n1 +$n2 ] echo "两者和是$SUM " } read -p "输入一个数n1" n1read -p "输入第二个数n2" n2GetSum $n1 $n2 输入一个数n1100 输入第二个数n2200 两者和是300
shell综合案例
补充知识点: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 find 位置 -ctime +10 -name "a.txt" -mtime -n +n -atime -n +n -ctime -n +n XXX -exec rm {} \; XXX -exec rm {} \+ rm 1rm 2rm 3rm 1 2 3-e filename -d filename -f filename -L filename -r filename
创建备份脚本 1 2 cd /usr/sbin vim mysql_db_backup.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 #!/bin/bash BACKUP=/data/backup/db DATETIME=$(date +%Y-%m-%d_%H%M%S) echo "$DATETIME " HOST=localhost DB_USER=root DB_PW=my123456 DATABASE=FirstTestDatabase [ ! -d $BACKUP /$DATETIME ] && mkdir -p "$BACKUP /$DATETIME " mysqldump -u$DB_USER -p$DB_PW --host=$HOST -q -R --databases $DATABASE > $BACKUP /$DATETIME /$DATETIME .txt cd $BACKUP tar -zcvf $DATETIME .tar.gz $DATETIME rm -rf $DATETIME find $BACKUP -atime +10 -name "*.tar.gz" -exec rm -rf {} \; echo "数据库$DATABASES 成功备份!"
定时调用 1 2 3 4 crontab -e */1 * * * * /usr/sbin/mysql_db_backup.sh 30 2 * * * sh /usr/sbin/mysql_db_backup.sh