Linux 之 shell 脚本

Linux 之 shell 脚本

  • 1、脚本的格式要求
  • 2、shell 脚本常用执行方式
    • 2.1、绝对路径或相对路径方式
    • 2.2、sh+脚本方式(不推荐)
  • 3、shell 的变量
    • 3.1、定义 shell 变量
    • 3.2、将命令返回值赋值给变量 (重点)
    • 3.3、设置环境变量
    • 3.4、位置参数变量
    • 3.5、预定义变量
  • 4、运算符
  • 5、条件判断
  • 6、流程控制
    • 6.1、if 判断
    • 6.2、case 语句
    • 6.3、for 循环
    • 6.4、while 循环
  • 7、read 读取控制台输入
  • 8、函数
    • 8.1、常用系统函数 basename
    • 8.2、常用系统函数 dirname
    • 8.3、自定义函数
  • 9、shell 综合案例

 
       shell 是一个命令行解释器,它为用户提供了一个向 linux 内核发送请求,以便运行程序的界面系统级程序。用户可以使用 shell 来启动、挂起、停止甚至编写一些程序。

 

1、脚本的格式要求

  • ①、脚本以 #!/bin/bash 开头。

  • ②、脚本需要有可执行权限。

 

2、shell 脚本常用执行方式

 

2.1、绝对路径或相对路径方式

 

# 输入shell 脚本的绝对路径或相对路径的方式,执行shell脚本

# 首先 需要对 shell 脚本 赋执行权限
chmod 744 test_shell.sh
# 相对路径的方式执行
./test_shell.sh
# 绝对路径的方式执行
/usr/myshell/test_shell.sh

 

2.2、sh+脚本方式(不推荐)

 
使用该方式不需要 赋予shell脚本执行权限,直接执行即可。

sh ./test_shell2.sh

 

3、shell 的变量

 
shell 的变量分为:系统变量 和 用户自定义变量。

  • 系统变量: H O M E 、 HOME、 HOMEPWD、 S H E L L 、 SHELL、 SHELLUSER 等

    # 输出系统变量
    echo "path = $PATH"
    echo "user = $USER"
    

3.1、定义 shell 变量

 

# 定义变量:  变量=值,示例:
A=100
# 撤销变量:  unset 变量, 示例:
unset A
# 声明静态变量:readonly 变量。注意:静态变量不能 unset。示例:
readonly B=101
# 把变量提升为全局环境变量,可供其他shell程序使用。

 

定义变量的规则

  • ① 变量名称可以由字母、数字和下划线组成,但不能以数字开头。
  • 等号两侧不能有空格。
  • 变量名称一般习惯为大写。

 

3.2、将命令返回值赋值给变量 (重点)

 

# 两种方式
# 方式一:反引号,运行里面的命令,并把结果返回给变量。示例:
A=`ls -la`
# 方式二:等同于反引号。示例:
A=$(ls -la)

 

3.3、设置环境变量

 
环境变量所在文件:

1.系统级:

  • ① /etc/profile:该文件是用户登录时,操作系统定制用户环境时使用的第一个文件,应用于登录到系统的每一个用户。该文件一般是调用/etc/bash.bashrc文件。
    /etc/bash.bashrc:系统级的bashrc文件。
  • ② /etc/environment:在登录时操作系统使用的第二个文件,系统在读取你自己的profile前,设置环境文件的环境变量。

2.用户级(这些文件处于家目录下):

  • ① ~/.profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件。这里是推荐放置个人设置的地方
  • ② ~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。不推荐放到这儿,因为每开一个shell,这个文件会读取一次,效率肯定有影响。
    ~/.bash_profile or ~./bash_login:这里没有引用作者的,下面会提到
    ~/.pam_environment:用户级的环境变量设置文件,没有做测试,不知道管不管用。

 

# 基本语法
# 将 shell 变量输出为环境变量
export 变量名=变量值
# 让修改后的配置信息立即生效
source 配置文件
# 查询环境变量的值
echo $变量名

# 示例:
export TOMCAT_HOME=/opt/tomcat
# 生效
source /etc/profile

 

3.4、位置参数变量

 
当我们执行一个 shell 脚本时,某些场景需要获取到执行 shell脚本的命令行参数信息,那么就可以使用位置参数变量。

基本语法:

命令 功能说明
$n n 为数字,$0 代表命令本身,$1- 9 代表第一个到第九个参数,十以上的参数需要用大括号包含,例: 9 代表第一个到第九个参数,十以上的参数需要用大括号包含,例: 9代表第一个到第九个参数,十以上的参数需要用大括号包含,例:{10}
$* 代表命令行中所有的参数,$*把所有的参数看成一个整体
$@ @ 也代表命令行中所有的参数,不过 @也代表命令行中所有的参数,不过 @也代表命令行中所有的参数,不过@把每个参数区分对待
$# 代表命令行中所有参数的个数

 

[root@myCentos6 zim]# vim test.sh

#!/bin/bash
echo "获取并打印命令行参数"
echo "$0 $1 $2"
echo "打印全部参数: $*"
echo "打印全部参数-> $@"
echo "参数个数 = $#"

[root@myCentos6 zim]# ls -l
总用量 4
-rw-r--r--. 1 root root 154 828 11:45 test.sh
[root@myCentos6 zim]# chmod 744 test.sh
[root@myCentos6 zim]# ls -l
总用量 4
-rwxr--r--. 1 root root 154 828 11:45 test.sh
[root@myCentos6 zim]# ./test.sh aa 100
获取并打印命令行参数
./test.sh aa 100
打印全部参数: aa 100
打印全部参数-> aa 100
参数个数 = 2
[root@myCentos6 zim]# 

 

3.5、预定义变量

 
       预定义变量,就是 shell 脚本设计者事先已经定义好的变量,可以直接在shell脚本中使用。预定义变量是一开始执行Script脚本时就会设定,且不能被修改,预定义变量当一执行程序时就有了。

基本用法:

  • $$ :当前进程的进程号PID。

  • $! :后台运行的最后一个进程的进程号pid。

  • $? :最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数字,由命令自己决定),则证明上一个命令执行错误。

 

4、运算符

 

# 基本语法
# 方式一:  $((运算式)) 示例:
RESULT=$((2+3)*4)
echo "result=$RESULT"
# 方式二:   $[运算式]  示例:
RESULT=$[(2+3)*4]
echo "result=$RESULT"
# 求两个参数的和
SUM=$[$PARAM1+$PARAM2]
# 方式三:   expr m+n  注意:expr 运算符间要有空格
# expr \*,/,%  分别代表 乘,除,取余
TEMP=`expr 2 + 3`
RESULT=`expr $TEMP \* 4`
echo "result=RESULT"

 

5、条件判断

 

# 判断语句,基本语法. 注意:condition 前后要有空格
# 非空返回 true,可使用 $? 验证(0 为 true, >1 为 false)
[ condition ]
# 应用实例: [ test_condition ]  返回true
[ test_condition ] 
# [] 返回false
[]
# 条件满足,执行后面的语句
[ condition ] && echo "ok" || echo "not ok"

# 案例:"ok 是否等于 ok"
if [ "ok100" = "ok" ]
then 
   echo "equal"
fi

# 案例:/root/install.log 目录中的文件是否存在
if [ -e /root/install.log ]
then 
    echo "文件存在"
fi    

 
常用判断条件

  • 两个整数的比较
    • = 字符串比较
    • -lt 小于
    • -le 小于等于
    • -eq 等于
    • -gt 大于
    • -ge 大于等于
    • -ne 不等于
  • 按照文件权限进行判断
    • -r 有读的权限 [ -r 文件 ] (注意前后有空格)
    • -w 有写权限
    • -x 有执行权限
  • 按照文件类型进行判断
    • -f 文件存在并且是一个常规的文件
    • -e 文件存在
    • -d 文件存在并是一个目录

 

6、流程控制

 

6.1、if 判断

 

# 基本语法
if [ 条件判断式 ];then
   程序
fi
# 或者 基本语法  (推荐使用)
if [ 条件判断式 ]
  then
    程序
  elif [ 条件判断式 ]
  then 
    程序
  fi  

注意事项:[ 条件判断式 ] ,中括号和条件判断式之间必须有空格。

 

6.2、case 语句

 

# 基本语法
case $变量名 in
"值1")
   如果变量的值等于值1,则执行程序1
   ;;
"值2")  
   如果变量的值等于值2,则执行程序2
   ;;
   … 省略其他分支 …
*)
   如果变量的值都不是以上的值,则执行此程序
   ;;
esac

# 应用示例:命令行参数是 1时,输出"周一",是2时输出"周二",其他情况输出"other"
#!/bin/bash
case $1 in 
"1")
  echo "周一"
  ;;
"2")
  echo "周二"
  ;;
*)
  echo "other"
  ;;
esac  
  

 

6.3、for 循环

 

# 基本语法1
for 变量 in 值1 值2 值3…
 do 
   程序
 done
 
# 示例: 打印命令行输入的参数
#!/bin/bash
for i in "$*"
do
  echo "the param is $i"
done
# 或
for j in "$@"
  do
     echo "the num is $j"
done     

# 基本语法2
for ((初始值;循环控制条件;变量变化))
 do 
   程序
done

# 示例:从1加到100 的值,输出显示
#!/bin/bash
SUM=0
for((i=1.i<=100;i++))
do 
   SUM=$[$SUM+$i]
done
echo "sum=$SUM"

 

6.4、while 循环

 

# 基本语法1
while[ 条件判断式 ]
do 
   程序
done
# 应用示例:从命令行输入一个数n,统计从1+…+ n 的值是多少
#!/bin/bash
SUM=0
i=0
while[ $i -le $1 ]
do
 SUM=$[$SUM+$i]
 i=$[$i+1]
done
echo "sum= $SUM"

 

7、read 读取控制台输入

 

# 基本语法
read [选项] [参数]
# 常用选项
  -p : 指定读取值时的提示符
  -t : 指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不等待
# 常用参数
  变量:指定读取值的变量名
  
# 应用实例1: 读取控制台输入的 num 值 并打印
#!/bin/bash
read -p "请输入一个数num1=" NUM1
echo "您输入的值时num1=$NUM1"

# 应用实例2: 读取控制台输入的 num 值,在10秒内输入,并打印
#!/bin/bash
read -t 10 -p "请输入一个数num2=" NUM2
echo "您输入的值时num2=$NUM2"

 

8、函数

 
shell 编程和其他编程语言一样,有系统函数,也可以自定义函数。

8.1、常用系统函数 basename

 

# basename 函数功能:返回完整路径最后 / 的部分,常用于获取文件名
# suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉
basename [pathname] [suffix]
# 应用示例: 返回/home/aaa/test.txt 的 "test"部分
basename /home/aaa/test.txt  .txt
# 应用示例: 返回/home/aaa/test.txt 的 "test.txt"部分
basename /home/aaa/test.txt

 

8.2、常用系统函数 dirname

 

# dirname 函数功能:返回完整路径最后 / 的前面部分,常用于返回路劲部分
# 从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回目录部分。
dirname 文件绝对路径

# 应用实例: 返回 /home/aaa/test.txt 的 /home/aaa
dirname /home/aaa/test.txt

 

8.3、自定义函数

 

# 基本语法
[ function ] funname[()]
{
  Action;
  [return int;]
}
# 调用直接写函数名: funname [值]

# 应用实例:计算输入两个参数的和 (read),getSum
#!/bin/bash
function getSum() {
   SUM=$[$n1+$n2]
   echo "sum=$SUM"
}

read -p "请输入第一个数n1" n1
read -p "请输入第二个数n2" n2

getSum $n1 $n2

 

9、shell 综合案例

 
需求:

  • ① 每天凌晨 2:10 备份数据库 myDb 到 /data/backup/db

  • ② 备份开始和备份结束,能够给出相应的提示信息

  • ③ 备份后的文件要求以备份时间为文件名,并打包成 .tar.gz 的形式,比如:2023-08-28_230201.tar.gz

  • ④ 在备份的同时,检查是否有10天前备份的数据库文件,如果有就将其删除。

在 /usr/sbin 目录下创建 mysql_db_backup.sh 脚本

vim /usr/sbin/mysql_db_backup.sh

编写 mysql_db_backup.sh 脚本

#!/bin/bash
# 备份的路径
BACKUP=/data/backup/db
# 当前的时间作为文件名
DATETIME=$(date +%Y_%m_%d_%H%M%S)
echo "==开始备份数据库myDb=="
echo "==备份的路径是 $BACKUP/$DATETIME.tar.gz=="
# 主机
HOST=localhost
# 用户名
DB_USER=root
# 密码
DB_PWD=root
# 备份数据库名称
DATABASE=myDB
# 创建备份的路径
# 如果备份的路径文件夹存在就直接使用,否则就创建
[ ! -d "$BACKUP/$DATETIME" ] &&  mkdir -p "$BACKUP/$DATETIME"
# 执行 mysql 的备份数据库的指令
mysqldump -u${DB_USER} -p${DB_PWD} --host=$HOST  $DATABASE | gzip > $BACKUP/$DATETIME/$DATETIME.sql.gz
# 打包备份文件
cd $BACKUP
tar -zcvf $DATETIME.tar.gz $DATETIME
# 删除临时目录
rm -rf $BACKUP/$DATETIME
# 删除10天前的备份文件
find $BACKUP -mtime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "==备份文件成功=="

crontab 设置定时任务

10 2 * * * /usr/sbin/mysql_db_backup.sh

 
 
 
 
 
 
 
.

你可能感兴趣的:(Linux,shell,shell运算符,shell条件判断,shell流程控制,执行shell)