您好,登錄后才能下訂單哦!
這篇文章主要介紹了Linux基礎之如何編寫shell腳本,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。
Shell的概念是源自Unix的命令解釋器。Shell不僅可解釋用戶輸入的命令,同時,可解釋執行基于命令的腳本語言。使用shell腳本能提高用戶操作和管理員進行系統管理的效率。shell腳本擅長處理純文本類型的數據,而Linux中幾乎所有的配置文件、日志都是純文本類型。
1.腳本統一存放目錄 2.選擇解釋器, 開頭要寫#! XXX,內核根據#!后的解釋器來確定用哪個解釋器解釋腳本內容 3.編輯腳本使用vim, 配置~/.vimrc方便個人書寫習慣 4.文件名規范,結尾以sh結束
1.#!/bin/bash 必須的,指出shell的類型 2.# 注釋。在shell中,注釋寫在#之后,#之后的內容不會執行 3.變量 4.控制 循環分支
1.#! 注明執行腳本采用的shell 2.$ 變量符。 與反斜杠轉義符相反,使其后的普通字符作為變量名,如$a表示變量a的值。變量 字符長度超過1個時,用{}括起來 3.單引號。 被引起的字符全部做普通字符,即全部原樣echo 'my $SHELL' 4.雙引號 引號內的內容,除$、轉義符\、倒引號`這三個保留特殊功能,其他字符均做普通字符。 5.倒引號(數字1鍵旁邊的那個鍵) 引號內的字符串當做shell命令行解釋執行(同樣的功能也可以使用$()來使用),得到的結果 取代整個倒引號括起來的部分。 6.反斜線 反斜線是轉義字符,它能把特殊字符變成普通字符。在某個字符前面利用反斜杠(\)能夠阻止 shell把后面的字符解釋為特殊字符。 7.* 代表0個或者多個特殊字符 例子 yum.* 代表的可以使yum.也可以是yum.a、yum.ab、yum.abc 當然小數點后面可以有多個字母 8.? 代表的是任意一個字符 例子 yum.? 可以是yum.a yum.b yum.c,但是要注意小數點后面必須有任意一個字符 9.[] 代表的是中括號中的任意一個 [abcdef] 可以是a b c d e f 中的任意一個字母當然也可以是數字 [-]代表的是一個范圍 [a-z] 表示的是字母a到z之間的所有字母 [^]^是反向選擇符號從字面意思可以知道也就是非的意思 [^abc]表示只要不a b c 這三個字符中的任意一個就選擇 10.$( ) 可以將命令替換輸出賦值給變量 11.{} 通過括號擴展可以生成需要的字串,括號中可以包含連續的序列或使用逗號分隔的多個項目,連續的序列包括一個起點和一個終點 user@computer: ~$ echo {a,b,c} a b c user@computer: ~$ echo user{1,5,8} user1 user5 user8 user@computer: ~$ echo {0..10} 0 1 2 3 4 5 6 7 8 9 10 user@computer: ~$ mkdir {dir1,dir2,dir3} user@computer: ~$ ls –ld dir{1,2,3}
shell變量可以保存路徑名、文件名或者一個數字等。分為三類:
本地變量: (局部變量)只在創建它們的Shell中使用,可以在shell程序內任意使用和修改它 們。 環境變量: 可以在創建它們的Shell及其派生出來的任意子程序中使用。有些變量是用戶創建 的,其他的則是專用的(比如PATH、HOME)。是系統環境的一部分,不必去定義它們,可以在 shell程序中使用它們 。還能在shell中加以修改。 內部變量: 由系統提供的。與環境變量不同,用戶不能修改它們。
本地變量 在用戶現在的shell生命期的腳本中使用 變量名=值 1.等號兩邊不可以有空格 2.取值包含空格,必須用雙引號括起來 3.Shell變量可以用大小寫字母,區分大小寫 變量是弱類型的, 不用聲明類型 # 變量聲明及賦值格式 變量=值(等號兩邊不能有空格) # 變量的引用 $變量名 ${變量名} 變量名為1個字符時建議使用方式一,多余一個字符時建議使用方式二 舉例: $a ${abc} # 清除變量 unset 變量名 user@computer: ~$ name=Jack user@computer: ~$ echo ${name} user@computer: ~$ unset name # 注意,name前沒有$ # 設置只讀變量 設置變量時,不想再改變其值,可以將之設為只讀變量 變量名=值 readonly 變量名
Bash預設了很多環境變量,實際使用中,可以直接調用這些變量。環境變量可以用于所有子程序,著包括編輯器、腳本和應用
內置環境變量
HOME: 代表使用者的家目錄。cd ~ 去到使用者的家目錄 或者利用 cd 就可以直接回到使用者 家目錄了。 SHELL: 目前這個環境使用的 SHELL 是哪個程序? 如果是 bash 的話,預設是 /bin/bash PWD:用戶當前工作目錄的路徑。它指出用戶目前在Linux文件系統中處在什么位置。它是由 Linux自動設置的 HISTSIZE: 這個與“歷史命令”有關,曾經下達過的指令可以被系統記錄下來,而記錄的“數目” 則是由這個值來設定的。 PATH: 就是執行文件搜尋的路徑,目錄與目錄中間以冒號(:)分隔, 由于文件的搜尋是依序由 PATH的變量內的目錄來查詢,所以,目錄的順序也很重要。
環境變量可以在命令行中設置,但用戶注銷時這些值將丟失 環境變量均為大寫 必須用export命令導出 # 設置環境變量 variable-name=value export variable-name(環境變量名大寫) # 顯示環境變量 env 可以看到所有的環境變量 echo $環境變量名 (顯示一個變量) # 清除環境變量 unset 環境變量名
修改path環境變量
修改PATH環境變量,使腳本不用加路徑,直接輸入文件名字即可執行。 # 命令行修改環境變量 以下在用戶user主目錄下操作: mkdir shdir && cd shdir vi hello chmod 755 hello cd ~ export PATH=$PATH:$HOME/shdir 在任何目錄下,輸入hello即可執行該文件。 本方式下環境變量如果修改錯了,exit退出后重新登陸即可恢復系統默認的值。
配置文件中修改環境變量
注意,修改環境變量前最好先備份一下舊的: export tem=$PATH echo $tem >>pathbake 需要知道環境變量與哪些配置文件有關:不同發行版會有不同,但命名還是有通性的: find / -name “*profile” find / -name “*bashrc” 全局配置文件/etc/profile 本地配置文件~/.bashrc
內部變量是Linux所提供的一種特殊類型的變量,這類變量在程序中用來作出判斷。在shell程序內這類變量的值是不能修改的。
部分內部變量是: $# 傳送給shell程序的位置參數的數量 $? 最后命令的完成碼或者在shell程序內部執行的shell程序(返回值) $0 shell程序的名稱 $* 調用shell程序時所傳送的全部參數的單字符串,"參數1", "參數2"…形式保存的參數 $@ "參數1", "參數2"…形式保存的參數 $n 第n個參數 $$ 本程序的PID $! 上一個命令的PID
# read 從鍵盤上讀取變量的值 read [選項] 變量名列表 常用選項 -a ANAME 將輸入讀入ANAME的數組 -n NCHARS 讀入N個字符 -p PROMPT 顯示一個提示 -r 取消轉移 -s 安靜模式,輸入的字符將不會提示 -t TIMEOUT 超過指定時間,read自動停止 # echo 顯示字符串或變量的值 echo [選項] 字符串 常用選項 -n 不在最后自動換行 -e 啟用反斜線控制字符的轉換 -E 不處理轉義字符。此為缺省選項;
#! /bin/bash # 輸入一句話,打印輸入的話 read -p 'please type some words, I will print them: ' words echo $words
# test test 條件表達式 如果測試條件為真,test命令會返回0,否則返回一個非0的數值 test 語句與if/then和case語句一起,構成shell編程的控制轉移結構 # [] [ 條件表達式 ] 方括號的內側兩邊各需一個空格 條件表達式的值為真返回零,為假時返回非零值
條件語句 | 真假 |
---|---|
-d filename | 若文件filename為目錄文件,則返回真 |
-f filename | 文件是否存在且為普通文件,則返回真 |
-r filename | 若文件filename可讀,則返回真 |
-s filename | 若文件filename的長度大于0,則返回真 |
-w filename | 若文件filename可寫,則返回真 |
-x filename | 若文件filename可執行,則返回真 |
-e filename | 文件是否存在 |
#! /bin/bash # 輸入文件的絕對路徑,判斷文件是否存在 read -p 'input file path: ' file if [ -e $file ] then echo '文件存在' else echo '文件不存在' fi
if [ 條件表達式 ] then 命令序列1 else 命令序列2 fi 當"條件表達式"的測試值為真時,執行"命令序列1",否則,執行"命令序列2"。命令序列中的命令 可以是一個或者多個。 if [ 條件表達式 ]; then 命令序列 fi 當"條件表達式"的測試值為真時,執行"命令序列",否則,執行條件語句后面的命令。條件表達 式與then之間的分號";"起命令分隔符的作用。 語法形式三 if test 條件表達式1 then 命令序列1 elif [ 條件表達式2 ] then 命令序列2 else 命令序列3 fi 這是包含二層嵌套的條件語句,當"條件表達式1"為真時,執行"命令序列1",否則,在"條件表 達式2"為真的情況下,執行"命令序列2",否則,執行"命令序列3","命令序列3"屬于第2個條 件語句的一部分。
#! /bin/bash
# 判斷輸入的路徑是文件還是目錄
read -p 'please input the file path: ' file
if [ -d $file ]
then
echo 'this is a directory'
elif [ -f $file ]
then
echo 'this is a file'
else
echo 'wrong file type, or the file do not exist'
fi
操作符 | 含義 |
---|---|
n1 –eq n2 | 判斷數字n1與n2是否相等,若相等,返回0,否則,返回1 |
n1 –ne n2 | 判斷數字n1與n2是否不等,若不等,返回0,否則,返回1 |
n1 –lt n2 | 判斷數字n1是否小于n2,若是,返回0,否則,返回1 |
n1 –gt n2 | 判斷數字n1是否大于n2,若是,返回0,否則,返回1 |
n1 –le n2 | 判斷數字n1是否小于或等于n2,若是,返回0,否則,返回1 |
n1 –ge n2 | 判斷數字n1是否大于或等于n2,若是,返回0,否則,返回1 |
操作符 | 含義 |
---|---|
string | 若字符串string非空,則返回真 |
-n string | 若字符串string長度大于0,則返回真 |
-z string | 若字符串string長度為0,則為返回真 |
string1 = string2 | 若字符串string1和string2相等,則返回真 |
string1 != string2 | 若字符串string1和 string2不等,則返回真 |
操作符 | 含義 |
---|---|
e1 –a e2 | 邏輯表達式e1和e2同時為真時,返回0,否則,返回1 |
e1 –o e2 | 邏輯表達式e1和e2有一個為真時,返回0,否則,返回1 |
! e1 | 若邏輯表達式e1不為真時,返回0,,否則,返回1 |
for 變量名 in 參數列表 do 命令列表 done 將"參數列表"中的元素依次賦給"變量名",在每次賦值后執行"命令列表","參數列表"表示"變 量名"的取值范圍 for ((初始化變量值;結束循環條件;運算)) do 命令序列 done while [ 條件表達式 ] do 命令列表 done 循環執行"命令列表"中的命令,直至"條件表達式"的值為假。 Until [ 條件 ] do 命令序列 Done 直到條件滿足時循環結束
#! /bin/bash # 將指定目錄下(參數傳遞$1)的所有以.txt為后綴的文件更名為*.doc directory=$1 if [ ! $directory ] then echo "please input the argument directory" exit fi files=`ls ${directory}` for file in $files; do if [ -f ${file} ] echo $file then suffix=${file#*\.} echo $suffix if [[ $suffix == "txt" ]] then prefix=${file%\.*} mv $directory/$file $directory/$prefix.doc fi fi done
functionname() { 命令列表 return } 函數的調用方式為: functionname arguments
感謝你能夠認真閱讀完這篇文章,希望小編分享Linux基礎之如何編寫shell腳本內容對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,遇到問題就找億速云,詳細的解決方法等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。