腳本編程語言與編譯型語言:
腳本編程語言:(Bash)
腳本編程語言通常是解釋型(interpreted),主要由解釋器(interpreter)讀入程序代碼,並將其轉換成內部的形式加以執行。
優點:
能夠輕易處理文件與目錄之類的對象。
缺點:
運行效率通常不如編譯型語言
編譯型語言:(C、C++、Java、Fortran、Ada、Pascal)
編譯型語言多半運作於底層,所處理的是字節、整數、浮點數或其它及其機器層經的對象。
SHELL腳本的基本語法格式:
腳本必須以#!開頭:(# cat /etc/shells)
例如#!/bin/bash(解釋器)
# 其中間可以添加一些注釋信息,例如腳本的使用方法、腳本的功能、創建日期、作者等相關信息
然後賦予腳本具有執行權限,# chmod +x scripts.sh
執行則使用./scripts.sh ##也可以將此腳本的路徑添加到PATH變量中,以後直接使用腳本名稱直接運行。
腳本的測試工具bash:
-n:檢查腳本是否有語法錯誤,有則顯示錯誤信息,否則無信息(沒有消息才是最好的消息)
-x:檢查腳本在執行中的詳細過程(排錯時,經常會用到)
exit:退出腳本(其數值為0-255)
如果腳本沒有明確定義退出碼,那麼在執行腳本結束前的退出碼為此腳本的退出碼。
# echo $? ##查看上一個命令執行結果所顯示的狀態碼
SHELL腳本的邏輯關系總結:
邏輯與:符號為&&:
如果其中一個為假,則結果一定為假
如果第一個條件結果為假,則第二個條件不用再判斷,最終結果已顯示
如果第一個條件結果為真,則第二個條件必須判斷
范例:
# useradd redhat && echo "redhat" | passwd --stdin redhat
解說:如果useradd redhat執行成功,則繼續執行下一條命令,否則終止。
邏輯或||:
如果其中一個條件結果為真,則結果一定為真,不用檢查後面的語句
如果其中一個條件結果為假,則檢查下一個條件語句
范例:
# id redhat || useradd redhat
解說:如果redhat用戶存在,就顯示redhat用戶相關信息,否則添加此賬戶。
邏輯與和邏輯或聯合使用范例:
# id redhat && echo “redhat already existing“ || useradd redhat
解說:如果redhat用戶存在,則顯示redhat用戶已存在,否則添加此賬戶。
條件判斷語句總結:
單分支if語句 雙分支if語句 多分支if語句 case選擇語句
if 判斷條件 ;then if 判斷條件;then if 判斷條件;then case $1 in
statement statement statement string)
...... ........ ......... statement;;
fi else elif 判斷條件;then string2)
statement statement statement;;
..... ......... ......)
fi elif 判斷條件;then statement;;
statement esac
.........
else
statement
fi
范例:
腳本分析:
主要功能:傳遞一個不同的參數,來完成用戶的創建、添加密碼、刪除用戶。
詳細說明:
當我們傳遞--add參數給此腳本時,此腳本為完成指定用戶的添加,如果添加的用戶存在,則提示用戶以存在,否則添加指定用戶並創建以用戶為自身的密碼;
當我們傳遞--del參數給此腳本時,此腳本會刪除我們指定的用戶,如果存在則刪除此用戶,否則提示用戶不存在。
當我們傳遞--help參數給此腳本時,此腳本會給我們現實腳本的使用方法。
當我們傳遞其它參數時,會提示無法識別的選項。
POSIX的結束狀態總結:
0: ##命令成功所顯示的狀態
>0: ##在重定向或單詞展開期間(~、變量、命令、算術展開及單詞切割)失敗
1-125 ##命令不成功所顯示的狀態。
126 ##命令找到了,但文件無法執行所顯示的狀態
127 ##命令找不到,所顯示的狀態
>128 ##命令因收到信號而死亡
替換運算符總結(變量的賦值):
${varname:-word}
如果varname存在且非null,則返回其值;否則,返回word;
用途:如果變量未定義,則返回默認值
范例:如果count未定義,則${count:-0}的值為0
${varname:=word}
如果varname存在且非null,則返回其值;否則,將varname設置為word,並返回其值;
用途:如果變量未定義,則設置變量為默認值
范烈:如果count未定義,則${count:=0}的值為0
${varname:+word}
如果varname存在且非null,則返回word;否則,返回null;
用途:為測試變量的存在
范例:如果count已定義,則${count:+1}的值為1
${varname:?message}
如果varname存在且非null,則返回其值;否則顯示varname:message,並退出當前命令或腳本;
用途:為了捕捉由於變量未定義所導致的錯誤。
范例:如果count未定義,${count:?"undefined!"}則顯示count:undefined!
模式匹配運算符總結:
假設path變量的值為:/etc/sysconfig/network-scripts/ifcfg-eth0.text.bak
${variable#pattern}:
如果模式匹配於變量值的開頭處,則刪除匹配的最短部分,並返回剩下的部分;
范例:echo ${path#/*/}的值為etc/sysconfig/network-scripts/ifcfg-eth0.text.bak
${variable##pattern}
如果模式匹配於變量值的開頭處,則刪除匹配的最長部分,並返回剩下的部分;
范例:echo ${path##/*/}的值為ifcfg-eth0.text.bake
${variable%pattern}
如果模式匹配於變量的結尾處,則刪除匹配的最短部分,並返回剩下的部分;
范例:echo ${path%.*}的值為/etc/sysconfig/network-scripts/ifcfg-eth0.text
${variable%%pattern}
如果模式匹配於變量的結尾處,則刪除匹配的最長部分,則返回剩余部分。
范例:echo ${path%%.*}的值為/etc/sysconfig/network-scripts/ifcfg-eth0
${#variable}
顯示variable變量值的字符長度
Shell腳本常用的循環語句總結:
for循環 while循環 until循環
for 變量 in 列表 ;do while condition(條件);do until condition ;do
command... statements statements
done done done
while循環:只要condition滿足條件,while會循環
until循環:只要condition不滿足條件,until會循環
test命令
test命令可以處理shell腳本中的各類工作,它產生的不是一般輸出,而是可使用退出狀態,test接受各種不同的參數,可控制它要執行哪一種測試
語法:
test [ expression ]
test [ [expression] ]
用途:
為了測試shell腳本裡的條件,通過退出狀態返回其結果。
行為模式:
test用來測試文件的屬性、比較字符串、比較數字
主要選項與表達式:
string string不是null
-b file file是塊設備文件(-b)
-c file file是字符設備文件(-c)
-d file file為目錄(-d)
-e file file是否存在
-f file file是一般文件(-)
-g file file有設置它的setgid位
-h file file是一個符號鏈接
-r file file是可讀的
-s file file是socket
-w file file是可寫的
-x file file是可執行的,或file是可被查找的目錄
s1 = s2 s1與s2字符串相同
s1 != s2 s1與s2字符串不相同
n1 -eq n2 整數n1與n2相等
n1 -ne n2 整數n1與n2不相等
n1 -lt n2 整數n1小於n2
n1 -gt n2 整數n1大於n2
n1 -le n2 整數n1小於或等於n2
n1 -ge n2 整數n1大於或等於n2
-n string string是非null
-z string string為null
本文出自 “See you next year CA” 博客,請務必保留此出處http://guodayong.blog.51cto.com/263451/1188606