Linux shell编程学习

本文详细介绍了Shell脚本的基础知识,包括脚本创建与执行、变量定义与使用、条件判断与循环控制等内容,并通过实例演示如何实现数据库备份等实用功能。

一、创建一个hello.sh

#!/bin/bash
echo "hello world"

① 注意 #!/bin/bash

shell脚本以 #!/bin/bash 开头,表示我们的shell为bash shell

② 脚本需要可执行权限

[root@master-129 myshell]# chmod +x hello.sh 
[root@master-129 myshell]# ll
总用量 4
-rwxr-xr-x. 1 root root 32 5月  28 17:33 hello.sh
[root@master-129 myshell]# ./hello.sh 
hello world

添加可执行权限后,执行 ./hello.sh

③ 如果没有执行权限 可以使用sh命令也是可以的

[root@master-129 myshell]# sh hello.sh 
hello world

二、变量

#!/bin/bash
#定义一个变量A
A=100 ##注意这里不需要加$符号, "="等号两边不能加空格
echo $A ###输出需要加$
echo A=$A ##没有加引号也表示字符串,遇到$符号就表示是变量
echo "A=$A" ##也是可以的 表示在字符串中

#销毁变量
unset A ##不用加$符号
echo $A ##如果变量被销毁,输出为空

##定义一个静态变量
readonly B=2 ##静态变量不能被销毁
echo $B

## `` 和 $() 表示中间的字符串以命令执行后结果输出
C=date
D=`date`
F=$(date)
echo $C
echo $D
echo $F

①定义变量的规则

1、由字母、数字、下划线组成,不能以数字开头

2、等号两侧不能空格

3、变量名一般习惯为大写,这是一个规范

② 将命令的返回值赋值给变量

A=`date`

A=$(date)

③ 全局变量

1、在/etc/profile最后面添加

export PHP_HOME=/usr/local/php

上面的PHP_HOME就是全局变量

2、必须要用 source /etc/profile 才能生效

④多行注释

:<<!
多行注释的内容
!

⑤ 命令传参变量 

我们执行shell脚本时,可以在后面添加参数,然后脚本拿到参数变量

#!/bin/bash

echo "$0 $1 $2 $3" ## $0表示命令本身 $1变量1 $2变量2 $3变量3

echo $*  ##输出所有的传量参数

echo $@  ##输出所有的传量参数

echo $#  ##变量的个数

执行上面的脚本

[root@master-129 myshell]# sh position.sh 100 200 300
position.sh 100 200 300
100 200 300
100 200 300
3

三、运算符 

有三种写法,推荐使用第二种,最重要的是语法跟编程语言不一样,例如java、php等,都是直接相加,而shell需要 $[a+b] 有一个运算写法

① #第一种 $((运算式))

#计算 (2+3) * 4
#第一种 $((运算式))
R1=$(((2+3)*4))
echo $R1

 ②  第二种 $[运算式] 推荐使用这种 比较直观

R2=$[(2+3)*4]
echo $R2

③ #第三种 expr

#第三种 expr
TEMP=`expr 2 + 3` ##运算式中间必须有 空格
R3=`expr $TEMP \* 4` ## *乘以 必须是 \*
echo $TEMP
echo $R3

四、条件判断

 ① 判断条件

1) 字符串的比较使用 "=",  这个跟我们常规的编程语言不一样

2) 两个整数的比较 

-lt 小于

-le 小于等于

-eq 等于

-gt 大于

-ge 大于等于

-ne 不等于

3)按照文件的权限进行判断

-r 有读的权限

-w 有写的权限

-x 有执行的权限

4) 按照文件的类型判断

-f 文件存在并且是一个常规的文件

-e 文件存在

-d 文件存在且是一个目录

4) 字符串

-z 字符串的长度为零则为真
-n 字符串的长度不为零则为真

② if 案例

if 可以用 [  ] 进行判断,也可以使用 tethst 来判断

#!/bin/bash
## 判断ok 是否等于 ok
if [ "ok" = "ok" ] ##判断的这里 if后面必须空格  [中间也需要空格]
then
        echo "equel"
fi

## 判断23是否大于等于22
if [ 23 -ge 22 ]
then
        echo "23大于22"
fi

## 判断/root/1.sql是否存在
if [ -f /root/1.sql ]
then
        echo "文件存在" 
fi

解析:if 这块的then不能直接写在 if [] 后面,像if [] then这样语法是不通过的

③ if多分支

if elif else fi 格式

#!/bin/bash
if [ $1 -lt 60 ]
then
        echo "小于60"
elif [ $1 -gt 60 ]
then
        echo "大于60"
        if [ $1 -gt 90 ]
        then
                echo "$1大于90"
        fi
else
        echo "等于60"
fi

④ case语句

#!/bin/case
case $1 in
"1")
        echo "周一"
;;
"2")
        echo "周二"
;;
*)
        echo "other"
;;
esac

使用的是 "1") 代码 ;; 组合判断的

五、循环

① 循环1到100

#!/bin/bash
## 循环100的值相加
SUM=0
for (( i=0; i<=100; i++))
do
        SUM=$[$SUM+$i]
done
echo $SUM

do done中的左边的SUM不需要带$符号

② 循环取出 $@ 的数据

$@表示命令行后面参数

for i in $@
do
        echo "num is $i"
done

③ while 循环

$1表示命令行后面的参数 -le小于的意思

#!/bin/bash
SUM=0
i=0
while [ $i -le $1 ]
do
        SUM=$[$SUM+$i]
        i=$[$i+1]
done
echo $SUM

④ 案例 九九乘法表

#!/bin/bash

for ((i = 1; i < 10; i++))
do
        for ((j = 1; j < 10; j++))
        do
                n=$[ $i * $j ]
                #echo $n
                echo -n  $i*$j=$n" "
                if [ $j -eq $i ]
                then
                        break
                fi
        done
        echo ""
done

 运行结果

六、read 读取控制台输入的内容

#!/bin/bash
#读取控制器输入的num1值
read -p "请输入一个数字" NUM1
echo "您输入的是$NUM1"

#读取控制台的数字 10s内输入
read -t 10 -p "请输入一个数字" NUM2
echo "您输入的$NUM2"

七、系统函数

[root@master-129 myshell]# dirname /root/1.txt
/root
[root@master-129 myshell]# basename /root/1.txt
1.txt

八、自定义函数

#!/bin/bash

##定义一个函数
function getSum() {
        SUM=$[ $m + $n ] ##这里的m和n变量名跟前面调用的要一样
        echo $SUM
}

read -p "请输入一个数字" n
read -p "请输入一个数组" m
getSum $n $m  ##调用函数

九、shell案例,备份数据库

 ① 编写shell

#!/bin/bash
## 每天凌晨2::30 备份mysql数据库 到/data/backup/db/
## 备份开始和备份能够给出相应的提示信息
## 备份文件名 2021-03-12_120210.tar.gz
## 备份的同时,检查是否有前10天的备份文件,如果有则删除

back_dir=/data/backup/db/
mysql_host=127.0.0.1
mysql_user=root
mysql_pwd=123456
mysql_db_name=test2

now_date=$(date +%Y-%m-%d_%H%M%S)
now_date_path="$back_dir$now_date"
backup_db_name="$now_date_path/$now_date.sql"
backup_db_tar_file="$back_dir$now_date.tar.gz"
#echo $now_date_path

## 1、创建路径
if [ ! -d $now_date_path ]
then
	mkdir -p $now_date_path
	echo "创建目录成功"
fi

## 2、导出mysql命令
mysqldump --single-transaction  -h$mysql_host -u$mysql_user -p$mysql_pwd -B $mysql_db_name > $backup_db_name 
#echo "保存的路径=$backup_db_name"

## 3、进行打包
echo $now_date_path
## 这块不能直接tar保存路径,不然tar把路径也保存了 所以需要使用cd
##tar -czvf $backup_db_tar_file $now_date_path
cd $back_dir
tar -czvf $backup_db_tar_file $now_date

## 4、删除路径
rm -fr $now_date_path

## 5、删除10天前的备份文件
find $back_dir -atime +10 -name "*.tar.gz" -exec rm {} \;

② 定时

[root@master-129 myshell]# crontab -l
30 2 * * * sh /root/myshell/mysql_back.sh

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值