1.什么是Shell腳本
Shell腳本是利用 shell 的功能所寫的一個程序 program,這個程序是使用純文本文件,將一些 shell 的語法與指令(含外部指令)寫在里面, 搭配正則表達式、管線命令與數據流重導向等功能,以達到我們所想要的處理目的。
Shell 腳本可以簡單的被看成是批處理文件, 也可以被說成是一個程序語言,且這個程序語言由于都是利用 shell 與相關工具指令, 所以不需要編譯即可執行,且擁有不錯的除錯 (debug) 工具,所以,shell可以幫助系統管理員快速的管理好主機。
2.Shell腳本特性
自動化常用命令
追蹤與管理系統的重要工作
簡單入侵檢測功能
連續指令單一化
簡易的數據處理
跨平臺支持與學習歷程較短
3.創建shell 腳本
第一步:使用文本編輯器(vim)來創建文本文件
第一行必須包括shell 聲明序列:#!
#!/bin/bash (告訴系統執行的時候要調用什么解釋器)
添加注釋
注釋以# 開頭 (# 都是批注用途,加在#后面的數據都被當做批注文字)
第二步:運行腳本
給予執行權限,在命令行上指定腳本的絕對或相對路徑
直接運行解釋器,將腳本作為解釋器程序的參數運行
例:計算/etc/passwd文件中的第10個用戶和第20個用戶的ID之和
#!/bin/bash #Filename:ID.sh 文件名:ID.sh #Description:Test 描述:測試 #Author:Rookie 作者:菜鳥 # Program: This program shows "ID sum!" in your screen. 程序:這個程序顯示“ID和!“在你的屏幕上 #Email:xxx@126.com 電子郵件:xxx@126.com #Revision:3.1 修訂號:3.1 #Date:2017-04-14 日期:2017-04-14 #Note:Test #The 10th in the/etc/passwd file ID of the user 在/etc/passwd文件中第10個用戶的ID id1=$(head -10 /etc/passwd | tail -1 | cut -d: -f3) #The 20th in the/etc/passwd file ID of the user 在/etc/passwd文件中第20個用戶的ID id2=$(head -20 /etc/passwd | tail -1 | cut -d: -f3) #Calculate a 10th of the/etc/passwd file users and 20th the sum of the user's ID 計算/etc/passwd文件中的第10個用戶和第20個用戶的ID之和 sum=$((id1+id2)) echo ${sum}
按 i 鍵進入輸入模式進行編輯
編輯完成后按 ESC鍵,進入編輯模式后按 ;輸入wq保存退出
[root@station29 scripts]# bash ID.sh sum=180 執行結果 ID和為180
變量:命名的內存空間
數據存儲方式:
字符:
數值:整型,浮點型
變量:變量類型
作用:
1 、數據存儲格式
2 、參與的運算
3 、表示的數據范圍
類型:
字符
數值:整型、浮點型
變量
強類型 :變量 不經過強制轉換,它永遠是這個數據類型,不允許隱式的類型 轉換。一般定義變量時必須指定類型、參與運算必須符合類型要求;調用未聲明變量會產生錯誤如 java,c#
弱類型:語言的運行時會隱式做數據類型 轉換。無須指定類型,默認均為字符型;參與運算會自動進行隱式類型轉換;變量無須事先定義可直接調用
如:bash 不支持浮點數,php
變量命名法則:
1 、不能使程序中的保留字:例如if, for
2 、只能使用數字、字母及下劃線,且不能以數字開頭
3 、見名知義
4 、統一命名 規則:駝峰命名法
bash 中變量的種類:
根據變量的生效范圍等標準:
本地變量:生效范圍為當前shell 進程;對當前shell 之外的其它shell 進程,包括當前shell 的子shell 進程均無效
環境變量:生效范圍為當前shell 進程及其子進程
位置變量:$1 $2…表示,用于讓腳本在腳本代碼中調用通過命令行傳遞給他的參數
局部變量:生效范圍為當前shell 進程中某代碼片斷( 通常指函數)
——–shell—–父shell —————-
| |
|———–bash 子shell—–|
子shell只會繼承環境變量 并不會繼承父shell中的變量
. 或者 source /etc/profile 只在當前的shell環境中執行,一般用來校對環境變量
set:顯示已經定義的所有變量
unset name:刪除變量
export name=將一個變量聲明為環境變量
readonly name=將一個變量聲明為只讀變量
last arg is ${10} 當位置參數達到10或10以上時需要加{}
變量引用:$name ${name}
位置變量:$1, $2, … 來表示,用于讓腳本在腳本代碼中調用通過命令行傳遞給它的參數
特殊變量:$?, $0, $*, $@, $#,$$
$0:命令本身
$*:傳遞給腳本的所有參數,全部參數合為一個字符串
$@:傳遞給腳本的所有參數,每個參數為獨立字符串
$#:傳遞給腳本的參數的個數
$* $@在被雙引號包起來的時候才會有差異
seet –:清空所在行以下所有位置變量
shift:踢掉變量 shift 5:踢掉5個變量
bash 中的算術運算:help let
+, -, *, /, % 取模(取余), ** (乘方)
實現算術運算:
(1) let var= 算術表達式
(2) var=$[ 算術表達式]
(3) var=$(( 算術表達式))
(4) var=$(expr arg1 arg2 arg3 …)
(5) declare –i var = 數值
(6) echo ‘ 算術表達式’ | bc
乘法符號有些場景中需要轉義 ,如*
[root@localhost ~]# x=100 [root@localhost ~]# y=200 [root@localhost ~]# let z=$x+$y [root@localhost ~]# echo $z 300
bash 有內建的隨機數生成器:
echo $RANDOM (0-32767)
echo $[$RANDOM%50] :0-49
[root@station29 scripts]# echo $[$RANDOM%50] 0 [root@station29 scripts]# echo $[$RANDOM%50] 44 [root@station29 scripts]# echo $[$RANDOM%50] 3 [root@station29 scripts]# echo $RANDOM 28979 [root@station29 scripts]# echo $RANDOM 22390 [root@station29 scripts]# echo $RANDOM 1374
增強型賦值:
+=, -=, *=, /=, %=
自增,自減:
let var+=1
let var++
let var-=1
let var–
邏輯運算
非:!
! 1 = 0
! 0 = 1
短路運算
短路與
第一個為0 ,結果必定為0
第一個為1 ,第二個必須要參與運算
短路或
第一個為1 ,結果必定為1
第一個為0 ,第二個必須要參與運算
異或:^
異或的兩個值, 相同為假,不同為真
bash 的測試類型
數值測試:
-gt |
是否大于 |
-ge |
是否大于等于 |
-eq |
是否等于 |
-ne |
是否不等于 |
-lt |
是否小于 |
-le |
是否小于等于 |
字符串測試:
== :是否等于;
>: ascii 碼是否大于ascii碼 碼
<: 是否小于
!=: 是否不等于
=~: 左側字符串是否能夠被右側的PATTERN所匹配
注意: 此表達式一般用于[[ ]] 中;擴展的正則表達式
-z “STRING” :字符串是否為空,空為真,不空為假
-n “STRING” :字符串是否不空,不空為真,空為假
注意:用于字符串比較時的用到的操作數都應該使用引號
存在性測試:
-e或-a |
文件存在性測試,存在為真,否則為假 |
-f |
是否存在且為普通文件 |
-d |
否存在且為目錄文件 |
-b |
是否存在且為塊設備文件 |
-c |
是否存在且為字符設備文件 |
-s |
是否存在且為套接字文件 |
-p |
是否存在且為命名管道文件 |
-h/-l |
是否存在且為符號鏈接文件 |
[root@localhost ~]# [ -e /etc/passwd -a -r /etc/passwd ] && echo ok ok [root@localhost ~]# [ -e /etc/passwd -a -r /etc/pas ] && echo ok 不存在 [root@localhost ~]# [ -e /etc/passwd -a -r /etc/passwd ] || echo ok 存在
首先,現判斷是否是鏈接文件,再判斷其它類別 [root@localhost ~]# [ -b /etc/passwd ] && echo ok [root@localhost ~]# [ -b /dev/cdrom ] && echo ok ok [root@localhost ~]# ll /dev/cdrom lrwxrwxrwx. 1 root root 3 May 16 21:46 /dev/cdrom -> sr0 [root@localhost ~]# [ -L /dev/cdrom ] && echo ok ok [root@localhost ~]# [ -d test/ ] && echo ok ok [root@localhost ~]# [ -f f1 ] && echo ok ok
文件權限測試:
-r |
是否存在且可讀 |
-w |
是否存在且可寫 |
-x |
是否存在且可執行 |
-u |
是否存在且擁有suid 權限 |
-g |
是否存在且擁有sgid 權限 |
-k |
是否存在且擁有sticky 權限 |
-s(文件大小測試) |
是否存在且非空 |
[root@localhost ~]# [ -r /etc/passwd ] && echo ok ok [root@localhost ~]# [ -w /etc/passwd ] && echo ok ok [root@localhost ~]# [ -x /bin/cat ] && echo ok ok [root@localhost ~]# [ -u /usr/bin/passwd ] && echo ok ok [root@localhost ~]# chmod 2755 /bin/cat [root@localhost ~]# [ -g /bin/cat ] && echo ok ok [root@localhost ~]# chmod o+t /app [root@localhost ~]# [ -k /app ] && echo ok ok [root@localhost ~]# chmod 777 /app 去掉黏滯位權限 查看既有讀權限又有寫權限
[root@localhost ~]# [ -s /etc/passwd ] && echo ok ok [root@localhost ~]# [ -r /etc/passwd -a -w /etc/passwd ] && echo ok ok 判斷文件不能執行 [root@localhost ~]# [ ! -x /etc/passwd ] && echo ok
文件是否打開:
-t fd: fd 表示文件描述符是否已經打開且與某終端相關
-N FILE :文件自動上一次被讀取之后是否被修改過
-O FILE :當前有效用戶是否為文件屬主
-G FILE
[root@localhost ~]# [ -N l1 ] && echo ok ok [root@localhost ~]# [ -O mbr ] && echo ok ok [root@localhost ~]# [ -G mbr ] && echo ok ok
雙目測試:
FILE1 -ef FILE2: FILE1 與FILE2 是否指向同一個設備
上的相同inode
FILE1 -nt FILE2: FILE1 是否新于FILE2
FILE1 -ot FILE2: FILE1 是否舊于FILE2
組合測試條件
第一種方式:
命令1 && 命令2 并且
命令1 || 命令2 或者
[ "$1" -gt "$2" ] && echo "$1 > $2" || echo "$1 <= $2" $1如果大于$2,就打印“$1>$2”,若不大于,就打印“$1<=$2”
如:[[ -r FILE ]] && [[ -w FILE ]]
第二種方式:
EXPRESSION1 -a EXPRESSION2 并且
EXPRESSION1 -o EXPRESSION2 或者
[ $a -gt 60 -a $a -lt 100 ] && echo Pass 如果a大于60小于100就打印Pass
必須使用測試命令
bash 的配置文件:
按生效范圍劃分,存在兩類:
全局配置:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
個人配置:
~/.bash_profile
~/.bashrc
交互式登錄:
(1) 直接通過終端輸入賬號密碼登錄;
(2) 使用“ “su – UserName” 切換的用戶
執行順序:
/etc/profile –> /etc/profile.d/*.sh –>~/.bash_profile –> ~/.bashrc –> /etc/bashrc
非交互式登錄:
(1)su UserName
(2) 圖形界面下打開的終端
(3) 執行腳本
執行順序:
~/.bashrc –> /etc/bashrc –>/etc/profile.d/*.sh
編輯配置文件生效:
修改profile 和bashrc 文件后需生效
兩種 方法:
1 重新啟動shell 進程
2 或source
例: . ~/.bashrc
條件性的執行操作符:
將多個條件寫入一個中括號內的情況之外, 可以多個中括號來隔開喔!而括號與括號之間,則以 && 或 || 來隔開,他們的意義是:
&& :與
命令1成功,就執行命令2
命令1 失敗,就不執行命令2
|| :或
命令1成功,就不執行命令2
命令1失敗,就執行命令2
例:
1. 這個文件是否存在,若不存在則給予一個『Filename does not exist』的訊息,并中斷程序;
2. 若這個文件存在,則判斷他是個文件或目錄,結果輸出『Filename is regular file』或 『Filename is directory』
3. 判斷一下,執行者的身份對這個文件或目錄所擁有的權限,并輸出權限數據!
#!/bin/bash #Filename:quanxian.sh #Description:Test #Author:Rookie # Program: # User input a filename, program will check the flowing: # 1.exist? 2.file/directory? 3.file permissions #Email:xxx@126.com #Revision:3.2 #Date:2017-04-14 PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH # 1. 讓使用者輸入檔名,并且判斷使用者是否真的有輸入字符串? echo -e "Please input a filename, I will check the filename's type and permission. \n\n" read -p "Input a filename : " filename test -z ${filename} && echo "You MUST input a filename." && exit 0 # 2. 判斷文件是否存在?若不存在則顯示訊息并結束腳本 test ! -e ${filename} && echo "The filename '${filename}' DO NOT exist" && exit 0 # 3. 開始判斷文件類型與屬性 test -f ${filename} && filetype="regulare file" test -d ${filename} && filetype="directory" test -r ${filename} && perm="readable" test -w ${filename} && perm="${perm} writable" test -x ${filename} && perm="${perm} executable"
輸出結果
[root@station29 scripts]# bash quanxian.sh Please input a filename, I will check the filename's type and permission. 請輸入文件名,我將檢查文件名的類型和權限 Input a filename : /etc The filename: /etc is a directory 文件名:/etc是目錄 And the permissions for you are : readable writable executable 你的權限:可讀可寫可執行
一個條件判斷,分成功進行與失敗進行 (else)
if [ 條件判斷式 ]; then
當條件判斷式成立時,可以進行的指令工作內容;
else
當條件判斷式不成立時,可以進行的指令工作內容;
Fi
多個條件判斷 (if … elif … elif … else) 分多種不同情況執行
if [ 條件判斷式一 ]; then
當條件判斷式一成立時,可以進行的指令工作內容;
elif [ 條件判斷式二 ]; then
當條件判斷式二成立時,可以進行的指令工作內容;
else
當條件判斷式一與二均不成立時,可以進行的指令工作內容;
Fi
elif 也是個判斷式,因此出現 elif 后面都要接 then 來處理
例:
1. 當執行一個程序的時候,這個程序會讓用戶選擇 Y 或 N ,
2. 如果用戶輸入 Y 或 y 時,就顯示OK, continue
3. 如果用戶輸入 n 或 N 時,就顯示 Oh, interrupt !
4. 如果不是 Y/y/N/n 之內的其他字符,就顯示 I don’t know what your choice is
#!/bin/bash #Filename:panduanshi.sh #Description:Test #Author:Rookie # Program:shows the user's choice #Email:xxx@126.com #Revision:3.2 #Date:2017-04-14 PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH read -p "Please input (Y/N): " yn if [ "${yn}" == "Y" ] || [ "${yn}" == "y" ]; then 如果輸入y 那么 echo "OK, continue" 繼續 elif [ "${yn}" == "N" ] || [ "${yn}" == "n" ]; then 如果輸入n 那么 echo "Oh, interrupt!" 中斷 else echo "I don't know what your choice is" 輸入其它字符,顯示我不知道你選擇什么 fi [root@station29 scripts]# bash panduanshi.sh Please input (Y/N): y OK, continue 繼續 [root@station29 scripts]# bash panduanshi.sh Please input (Y/N): n Oh, interrupt! 中斷 [root@station29 scripts]# bash panduanshi.sh Please input (Y/N): q I don't know what your choice is 我不知道你的選擇是什么
原創文章,作者:Linux.rookie,如若轉載,請注明出處:http://www.www58058.com/73351
主要介紹了bash編程的基礎特性及基礎用法,內容寫的很不錯,排版也很好,加油,加油!