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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章