學習linux的菜鳥 shell指令碼中的dat,計算器,內建變數的用法
什麼是shell指令碼。首先它是一個指令碼,並不能作為正式的程式語言。因為是跑在linux的shell中,所以叫shell指令碼。說白了,shell指令碼就是一些命令的集合。舉個例子,我想實現這樣的操作:
1)進入到/tmp/目錄;
2)列出當前目錄中所有的檔名;
3)把所有當前的檔案拷貝到/root/目錄下;
4)刪除當前目錄下所有的檔案。
簡單的4步在shell視窗中需要你敲4次命令,按4次回車。這樣是不是很麻煩?所以不妨把所有的操作都記錄到一個文件中,然後去呼叫文件中的命令,這樣一步操作就可以完成。其實這個文件呢就是shell指令碼了,只是這個shell指令碼有它特殊的格式。
Shell指令碼能幫助我們很方便的去管理伺服器,因為我們可以指定一個任務計劃定時去執行某一個shell指令碼實現我們想要需求。比如利用郵件的便利,我們可以在我們的linux伺服器上部署監控的shell指令碼,比如網絡卡流量有異常了或者伺服器web伺服器停止了就可以發一封郵件給管理員,同時傳送給管理員一個報警簡訊這樣可以讓我們及時的知道伺服器出問題了。
凡是自定義的指令碼建議放到/usr/local/sbin/目錄下,這樣做的目的是,一來可以更好的管理文件;二來以後接管你的管理員都知道自定義指令碼放在哪裡,方便維護
shell指令碼的基本結構以及如何執行
第一個shell指令碼
[root@localhost ~]# cd /usr/local/sbin/ [root@localhost sbin]# vim first.sh #! /bin/bash ## This is my first shell script. ## 2017.09.02.
date
echo "hello world"
Shell指令碼通常都是以.sh 為字尾名的,這個並不是說不帶.sh這個指令碼就不能執行,只是大家的一個習慣而已。
所以,以後你發現了.sh為字尾的檔案那麼它可能是一個shell指令碼了。shell指令碼中的第一行
shell指令碼也可以執行,但是這不符合規範。
# 表示註釋,後面跟一些該指令碼的相關注釋內容以及作者和建立日期或者版本等等。
當然這些註釋並非必須的,但建議還是寫上。。
因為隨著工作時間的逐漸過渡,你寫的shell指令碼也會越來越多,
如果有一天你回頭檢視自己寫過的某個指令碼時,很有可能忘記該指令碼是用來幹什麼的以及什麼時候寫的。
所以寫上註釋是有必要的。另外系統管理員並非只有你一個,
如果是其他管理員檢視你的指令碼,他看不懂豈不是很鬱悶。下面該執行一下這個指令碼了
[root@localhost sbin]# sh first.sh 2017年 09月 2日 星期六 18:58:02 CST Hello world!
其實shell指令碼還有一種執行方法就是:
其實shell指令碼還有一種執行方法就是:
[root@localhost sbin]# ./first.sh -bash: ./first.sh: 許可權不夠 [root@localhost sbin]# chmod +x first.sh [root@localhost sbin]# ./first.sh 2017年 09月 02日 星期六 18:58:51 CST Hello world!
要想使用該種方法執行shell指令碼,前提是指令碼本身有執行許可權,
所以需要給指令碼加一個 ‘x’ 許可權。
另外使用sh命令去執行一個shell指令碼的時候是可以加-x選項來檢視這個指令碼執行過程的,
這樣有利於我們除錯這個指令碼哪裡出了問題:
[root@localhost sbin]# sh -x first.sh + date 2017年 09月 02日 星期六 20:00:11 CST + echo 'Hello world!' Hello world!
命令 : date, 在shell中的用法
[root@localhost sbin]# date +"%Y-%m-%d %H:%M:%S" 2017-09-2 19:41:01
date在指令碼中最常用的幾個用法:
data+%Y
以四位數字格式列印年份
date+%y
以兩位數字格式列印年份
date+%m
月份
date+%d
日期
date+%H
小時
date+%M
分鐘
date+%S
秒
date+%w
星期,如果結果顯示0 則表示週日
有時在指令碼中會用到一天前的日期:
[root@localhost sbin]# date -d "-1 day" +%d 1
或者一小時前:
[root@localhost sbin]# date -d "-1 hour" +%H 18
甚至1分鐘前:
[root@localhost sbin]# date -d "-1 min" +%M 50
shell指令碼中的變數
如果你寫了一個長達1000行的shell指令碼,
並且指令碼中出現了某一個命令或者路徑幾百次。
突然你覺得路徑不對想換一下,那豈不是要更改幾百次?
你固然可以使用批量替換的命令,但也是很麻煩,並且指令碼顯得臃腫了很多。
變數的作用就是用來解決這個問題的。
[root@localhost sbin]# cat variable.sh #! /bin/bash ## In this script we will use variables. ## Writen by Aming 2017-09-2.
d=`date +%H:%M:%S` echo "The script begin at $d." echo "Now we'll sleep 2 seconds." sleep 2 d1=`date +%H:%M:%S` echo "The script end at $d1."
‘d’ 和 ‘d1’ 在指令碼中作為變量出現,定義變數的格式為變數名=變數的值
當在指令碼中引用變數時需要加上 ‘$’ 符號,下面看看指令碼執行結果吧:
[root@localhost sbin]# sh variable.sh The script begin at 20:16:57. Now we'll sleep 2 seconds. The script end at 20:16:59.
下面我們用shell計算兩個數的和:
[root@localhost sbin]# cat sum.sh #! /bin/bash ## For get the sum of tow numbers. ## 2017.09.02. a=1 b=2 sum=$[$a+$b] echo "$a+$b=$sum"
數學計算要用[ ]括起來並且外頭要帶一個 ‘$’ 指令碼結果為:
[root@localhost sbin]# sh sum.sh 1+2=3
Shell指令碼還可以和使用者互動:
[root@localhost sbin]# cat read.sh #! /bin/bash ## Using 'read' in shell script. ## 2017.09.02. read -p "Please input a number: " x read -p "Please input another number: " y sum=$[$x+$y] echo "The sum of the two numbers is: $sum"
read 命令就是用在這樣的地方,用於和使用者互動,把使用者輸入的字串作為變數值。指令碼執行過程如下:
[root@localhost sbin]# sh read.sh Please input a number: 2 Please input another number: 10 The sum of the two numbers is: 12
有時候我們會用到這樣的命令
/etc/init.d/iptablesrestart
前面的/etc/init.d/iptables檔案其實就是一個shell指令碼,為什麼後面可以跟一個 “restart”?
這裡就涉及到了shell指令碼的預設變數。
實際上,shell指令碼在執行的時候後邊是可以跟引數的,而且還可以跟多個
root@localhost sbin]# cat option.sh #! /bin/bash echo "$1 $2 $0"
執行結果:
[root@localhost sbin]# sh option.sh 1 2 1 2 option.sh