shell学习:第二阶段笔记汇总

目录

一、结构化命令

1. if条件语句

2. for循环语句

3. while循环语句

4. until循环语句

5. case分支语句

6. select循环语句

二、处理用户输入

三、脚本控制

1. 处理信号

2. 以后台模式运行脚本

3. 在非控制台下运行脚本

4. 作业控制

5. 预定时间运行

6. 开机自启动脚本


一、结构化命令

1. if条件语句

语法规则

1. 单条件判断

if ((condition));then
    content
else
    content
fi   

2. 多条件判断

if [[ condition1 ]];then
    content
elif [[ condition2 ]];then
    content
else
    content    
fi 

/bin/bash -n file.sh 用于检查脚本文件是否存在于法错误

逻辑运算符

运算符号

代表意义

=

等于 应用于:整型或字符串比较 如果在[] 中,只能是字符串

!=

不等于 应用于:整型或字符串比较 如果在[] 中,只能是字符串

<

小于 应用于:整型比较 在[] 中,不能使用 表示字符串

>

大于 应用于:整型比较 在[] 中,不能使用 表示字符串

-eq

等于 应用于:整型比较

-ne

不等于 应用于:整型比较

-lt

小于 应用于:整型比较

-gt

大于 应用于:整型比较

-le

小于或等于 应用于:整型比较

-ge

大于或等于 应用于:整型比较

-a

双方都成立(and) 逻辑表达式 –a 逻辑表达式

-o

单方成立(or) 逻辑表达式 –o 逻辑表达式

-z

空字符串

-n

非空字符串

-f

常用!侦测『档案』是否存在 eg: if [ -f filename ]

-d

常用!侦测『目录』是否存在 eg: if [ -d dirname ]

实用示例:自动备份mysql数据库脚本

`date +%Y%m%d` 表示系统时间

#!/bin/bash
#AUTO BACKUP MYSQL
#BY AUTHOR GCL 20191015

#1. define a directory to save the backup files.
backup_dir=/Users/guochunli/learning/shell/mysql_backup_files

#2. define the information about the database
user_name=root
database_schema=test

#3. indedicate back command
backup_cmd=/usr/local/opt/[email protected]/bin/mysqldump

#4. judge current user
if [ $UID -ne 0 ];then
	echo "Operation not permitted!Must use root to do it!"
	exit
fi

#5. check if the directory is existed
if [ ! -d ${backup_dir} ]; then
	mkdir -p ${backup_dir}
	echo "The directory is created successsfully!"
else
	echo "The directory is existed! Please move on!"
fi

#6. execute backup command
${backup_cmd} -u${user_name} -p -P3306 -d ${database_schema} > ${backup_dir}/${database_schema}.sql

#7. check whether backuped successfully
if [ $? -eq 0 ];then
	echo "database was backuped successfully!"
else 
	echo "database backup failed!"
fi

脚本可优化内容:

  1. 删除一个月前的此目录;
  2. 验证重复备份;

2. for循环语句

语法规则

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

应用场景:

  1. 查找文件
  2. 压缩和解压文件
  3. 远程主机批量传输文件

实用示例

1. 按条件查找日志文件并打包

#!/bin/bash
for file in `find /Users/guochunli/IdeaProjects -name "*.log" `
do 
    tar -czf log.tgz $i
done    
#需优化点:因为for循环机制,所以压缩文件时后者会覆盖前者,所以对于层级目录的文件,直截取文件名替换脚本中的【log.tgz】

2. 远程主机批量传输(执行)文件

ssh-copy-id 追加密钥

#!/bin/bash
#scp file to remote

files=$*
if [ -z $* ];then
	echo "{Usage: $0 /root/tmp/test.txt}"
	exit
fi

for i in "10.194.45.229 127.0.0.1"
do
	scp -r ${files} guochunli@$i:/tmp
done

#需优化点:可将目标位置也通过参数传输

3. while循环语句

while 循环用于不断执行一系列命令,也用于从输入文件中读取数据,命令执行完毕,控制返回循环顶部,从头开始直至测试条件为假。

语法规则

while command
do
   Statement(s) to be executed if command is true
done

使用示例

1. 1到10的求和

#!/bin/bash
#test while print numbers

num=0
while [[ num -le 10 ]];
do
        echo "num=$num";
        ((num++));
done;

2. 逐行读取文件内容

#!/bin/bash

file=$1
while read line
do
	echo $line
done < $file

4. until循环语句

until 循环执行一系列命令直至条件为 true 才退出循环。

until 循环与 while 循环在处理方式上刚好相反。

一般 while 循环优于 until 循环,但在某些时候,也只是极少数情况下,until 循环更加有用。

语法规则

until command
do
   Statement(s) to be executed until command is true
done

使用示例

#!/bin/bash

a=0

until [ ! $a -lt 10 ]
do
   echo $a
   a=`expr $a + 1`
done

5. case分支语句

语法规则

case 参数 in
模式1)
    command
    ;;
模式2)
    command
    ;;
*)
    command
    ;;
esac

;; 与其他语言中的 break 类似,意思是跳到整个 case 语句的最后。

使用示例

#!/bin/bash

echo 'Input a number between 1 to 4'
echo 'Your number is:\c'
read aNum
case $aNum in
    1)  echo 'You select 1'
    ;;
    2)  echo 'You select 2'
    ;;
    3)  echo 'You select 3'
    ;;
    4)  echo 'You select 4'
    ;;
    *)  echo 'You do not select a number between 1 to 4'
    ;;
esac

6. select循环语句

select 用来创建一个编号的菜单,供用户选择。

语法规则

select var in word1 word2 ... wordN 
 do 
     Statement(s) to be executed for every word. 
 done

二、处理用户输入

1. 读取用户输入 read

-p: 允许在 read 命令行中直接指定一个提示

-t: 指定 read 命令等待输入的秒数,当计时满时,read命令返回一个非零退出状态

-n: 设置 read 命令计数输入的字符

-e: 在输入的时候可以使用命令补全功能

练习

#!/bin/bash

#1.输入计时
if read -t 5 -p "你的名字是:" name
then
	echo "你好, $name"
else
	echo "\n 等的花都谢了,江湖再见!"
fi

#2.输入计数
read -n1 -p "你满意当前现状吗:" statusQuo
echo
case $statusQuo in
Y | y)
	echo "满意!";;
N | n)
	echo "不满意!";;
*)
	echo "无感~";;
esac

#3.隐藏输入内容
read -s -p "请输入你的密码,随意发挥吧,反正别人看不到~" passwd
echo 
echo "但是我还是知道哦,哈哈,你输入的是:${passwd}"

#4.读取文件
echo "----------------------------"
echo "Reading current file~"
cat -n $0 | while read line     
do
   echo "$line"
done
echo "finish"
echo "----------------------------"

三、脚本控制

1. 处理信号

信号

描述

1

SIGHUP

挂起进程

2

SIGINT

终止进程

3

SIGQUIT

停止进程

9

SIGKILL

无条件终止进程

15

SIGTERM

尽可能终止进程

17

SIGSTOP

无条件停止进程,但不是终止进程

18

SIGTSTP

停止或暂停进程,但不终止进程

19

SIGCONT

继续运行停止的进程

默认情况下,shell会忽略收到的任何SIGQUIT和SIGTERM信号,正因为这样,交互式的shell才不会被意外终止。

生成信号

  1. 中断进程:CTRL + C 组合键发送SIGIN信号
  2. 暂停进程:CTRL + Z 组合键发送SIGTSTP信号
  3. 终止进程:kill -9 PID 发送SIGKILL信号来无条件终止进程

捕获信号 trap

如果脚本收到trap命令列出的信号,该信号不再由shell处理,而是交由本地处理

命令格式: trap commands signals

trap - SIGNALS 移除捕获

#!/bin/bash
#Testing signal trapping
#
trap "echo 'Sorry! I have trapped Ctrl -C'" SIGINT
#
echo "This is a test scripte!"
#
count=1
while [ $count -le 10 ]
do
        echo "Loop #$count"
        sleep 1
        count=$[ $count + 1 ]
done
#
#remove the trap of SIGINT
trap - SIGINT
echo "I just moved the trap"
#
count=1
while [ $count -le 5 ]
do
        echo "Second Loop #$count"
        sleep 1
        count=$[ $count + 1 ]
done
echo "This is the end of the test script"

2. 以后台模式运行脚本

以后台模式运行脚本非常简单,只要在命令后面加一个 & 符号即可。

当 & 符号放到命令后面时,它会将命令和shell分离开,将命令作为系统中的一个独立的后台运行进程。

方括号中的数字是shell分配给后台进程的作业号。

方括号后面的数字是Linux系统分配给进程的PID。

当后台进程结束后,终端会显示一条消息:

运行多个后台作业

在命令行提示符下同时启动多个后台作业:

下面输出中可以看到,每个后台进程都和终端会话(ttsy001)终端联系在一起,如果终端会话退出,那么后台进程也会随即退出。

3. 在非控制台下运行脚本

nohup 命令可以在你退出/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思( no hang up)。

命令格式:

nohup [脚本文件] &

4. 作业控制

作业控制中的关键命令时jobs命令,jobs命令允许查看shell当前正在处理的作业。

参数说明:

-l 列出进程的PID即作业号

-n 只列出上次shell发出的通知后改变了状态的作业

-p 只列出作业的PID

-r 只列出运行中的作业

-s 只列出已停止的作业

带➕的作业被当作默认作业,带➖的作业被当作下一个默认作业。

!!!任何时候都只有一个带加号的作业和一个带减号的作业,不管shell当前有多少个正在运行的作业。

重启停止的作业

5. 预定时间运行

at是一次性定时计划任务,at的守护进程atd会以后台模式运行。

命令格式

at [-f filename] [time] Ctrl + D 结束at命令的输入

6. 开机自启动脚本

Linux系统使用cron程序来安排要定期执行的作业。cron程序会在后台运行并检查一个特殊的表(被称作cron时间表)。

cron时间表格式:

min hour dayofmonth month dayofweek command

dayofweek可以用三字符的文本值(mon、tue、wed、thu、fri、sat、sun)或数值(0为周日,6为周六)表示。

如何设置一个在每个月的最后一天执行的命令?

00 12 * * * if [ `date + %d -d tomorrow` = 01 ] ; then ; command

它会在每天中午12点来检查是不是当月的最后一天,如果是,cron将会运行该命令。

 

 

发布了22 篇原创文章 · 获赞 2 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章