linux shell腳本學習第一篇 sed基礎

此篇最好有一點linux內核以及操作系統知識,需要linux指令實際操作經驗。另外這篇文章加了sed工具的基礎,希望讀完這篇文章大家能知道shell和關於shell腳本的概念及基本文件操作。

一,腳本簡介

什麼是shell?

我在學習linux基礎中有提過,linux操作系統四大組成結構分別是內核,文件系統,shell,用戶程序。shell是用戶與kernel內核交互的媒介,它本身是一個用 C 語言編寫的應用程序,它是用戶使用 Linux 的橋樑。這個應用程序提供了一個界面,用戶通過這個界面訪問操作系統內核的服務。

因此正如你所想,shell也是有不同種類和版本的,不過由於易用和免費,Bourne Again Shell(Bash) 在日常工作中被廣泛使用。同時,Bash 也是大多數Linux 系統默認的 Shell。

爲什麼要使用shell

我們爲什麼喜歡用linux,與windows操作系統相比,程序員爲什麼更偏愛linux(別告訴我你不是)?
首先我們說windows是一個圖形界面化的操作系統,這大大降低了使用者的門檻,用戶只需要點點鼠標就能使用各種應用程序。發郵件瀏覽網頁打遊戲,所以windows是迄今爲止使用量最多的操作系統。

那對於程序員來說有什麼不同?
首先對於有一定計算機知識的人來說,他們對於支配計算機的需求更強烈,我希望能通過簡單的操作去操作存儲的文件,去獲取計算機資源的參數,去了解計算機的網絡動作並進行管理。這一切是不可能界面化的,需要通過工具來達到我們和操作系統交互的目的,這就是命令行界面shell,shell腳本就是包含需要執行命令的文件。

二,使用shell以及shell腳本

shell指令一般都是在shell終端執行,打開終端後一般會出現提示符:

username@hostname$

或者

root@hostname#

其中$表示普通用戶,#表示超級用戶。

關於 #! /bin/bash

#! 告訴系統其後路徑所指定的程序即是解釋此腳本文件的 Shell 程序,是一個約定的標記,它告訴系統這個腳本需要什麼解釋器來執行,即使用哪一種 Shell。所以shell腳本如果通過bash解釋,一般都會在最上邊寫這個

運行方式

一種是作爲可執行程序,假如你在shell終端打要運行的腳本test.sh,linux 系統會去 PATH 裏尋找有沒有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 裏,你的當前目錄通常不在 PATH 裏,所以寫成 test.sh 是會找不到命令的,要用 ./test.sh 告訴系統說,就在當前目錄找。
 

chmod +x ./test.sh  #使腳本具有執行權限
./test.sh  #執行腳本

或者作爲解釋器參數,直接運行解釋器,其參數就是 shell 腳本的文件名

/bin/sh test.sh

和學習任意一種語言一樣,我們來用例子快速過一下bash的基礎知識,多動腦理解,內容有所閹割,感興趣推薦在文尾的參考中找:

變量 

變量名和等號之間不能有空格,這可能和你熟悉的所有編程語言都不一樣。

JAVA_HOME_8=/usr/lib/Java/jdk1.8.0_181.jdk/Contents/Home #設置JAVA_HOME
echo $JAVA_HOME_8  #查看
#結果/usr/lib/Java/jdk1.8.0_181.jdk/Contents/Home
echo $SHELL     #查看shell版本


var="value"
echo $var #或者echo ${var}
#結果value

unset variable_name #用於刪除變量

字符串

字符串可以用單引號,也可以用雙引號,也可以不用引號。單雙引號的區別跟PHP類似。
單引號字符串的限制:
單引號裏的任何字符都會原樣輸出,單引號字符串中的變量是無效的;
單引號字串中不能出現單獨一個的單引號(對單引號使用轉義符後也不行),但可成對出現,作爲字符串拼接使用。

雙引號的優點:
雙引號裏可以有變量
雙引號裏可以出現轉義字符

#!/bin/bash
string="abcde"
echo ${#string}    #獲取字符串長度 5
echo ${string:1:4}    #截取字符串 bcde

 

數組

bash支持一維數組(不支持多維數組),並且沒有限定數組的大小。

類似於 C 語言,數組元素的下標由 0 開始編號。獲取數組中的元素要利用下標,下標可以是整數或算術表達式,其值應大於或等於 0。*和@可以表示數組的所有元素

my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D

echo "數組的元素爲: ${my_array[*]}"
echo "數組的元素爲: ${my_array[@]}"

 

函數

linux shell 可以用戶定義函數,然後在shell腳本中可以隨便調用。

demoFun(){
    echo "這是我的第一個 shell 函數!"
}
echo "-----函數開始執行-----"
demoFun
echo "-----函數執行完畢-----"

輸入輸出重定向

首先理解重定向的含義,這裏的重定向是把輸入輸出定向導入到文件中:

#Check add files
#如果不存在file1的文件,則創建並文字重定向輸入到此文件內
file1=test1.sh
if [ ! -f "$file1" ]; then
  cat > $file1 <<EOF
This is a test and I have add a file.
user="lishinho"
EOF
echo "Added"
fi

文件包含

和其他語言一樣,Shell 也可以包含外部腳本。這樣可以很方便的封裝一些公用的代碼作爲一個獨立的文件。
Shell 文件包含的語法格式如下:
. filename   # 注意點號(.)和文件名中間有一空格

source filename

我們編寫一個例子,創建並把文件1的user輸入到文件2中:

#!/bin/bash
file2=test2.sh
#Check add files
if [ ! -f "$file2" ]; then
  source ./test1.sh
  cat > $file2 <<EOF
user is $user
EOF
echo "Added file2"
fi

 

三,文件處理sed基礎

sed是stream editor的縮寫。它是文件處理中非常重要的工具,能匹配正則表達式。實際工作中,測試面對開發給的shell腳本,如果你能掌握好sed,對於看懂腳本內容將非常有幫助。同時,他強大的文本處理能力,配合着正則表達式使用,功能將不同凡響。它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲“模式空間”(pattern space)接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕,接着處理下一行,這樣不斷重複,直到文件末尾。

man sed看sed說明書

移除空白行

我們提到sed一次處理一行數據,在空白行中,行尾標誌緊接着行首標記

/pattern/d file刪除標記的行

$ sed '/^$/d' file

已匹配字符串標記&

\w\是正則表達式,表示每匹配一個單詞,我們就用[&]來替換它,&對應匹配的單詞 s表示替換

s :取代,可以直接進行取代的工作哩!通常這個 s 的動作可以搭配正規表示法!

$ echo this is an example | sed 's/\w\+/[&]/g'

sed插入並改變文件

i :插入, i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行);

$ 代表的是最後一行,sed 的 -i 選項可以直接修改文件內容

sed -i '$i\insert line\' file

a :新增, a 的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)~

a 動作是在匹配的行之後追加字符串,追加的字符串中可以包含換行符(實現追加多行的情況)。追加一行的話前後都不需要添加換行符 \n,只有追加多行時在行與行之間才需要添加換行符(最後一行最後也無需添加,添加的話會多出一個空行)。

文件第4 行之後追加 2 行:

sed -e '4 a newline\nnewline2' file

 

參考文獻:

1. 關於shell:https://www.runoob.com/linux/linux-shell.html

2. Linux shell腳本攻略

3. 關於sed:https://zhuanlan.zhihu.com/p/96696036

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章