歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> Unix基礎知識 >> Unix Shell腳本編程知識點

Unix Shell腳本編程知識點

日期:2017/3/3 15:23:51   编辑:Unix基礎知識

腳本編程語言與編譯型語言:

腳本編程語言:(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

Copyright © Linux教程網 All Rights Reserved