1. 程式人生 > >馬哥學習李洋個人筆記之shell腳本簡介

馬哥學習李洋個人筆記之shell腳本簡介

shell腳本簡介

腳本開頭以 #!/bin/bash 開始,表明這個腳本所使用的shell類型,相當於腳本的使用說明書.

腳本當中,引用的變量有如下幾種:

1 局部(本地)變量 只對當前shell進程起效,切換終端或退出再登錄都會丟失已對變量賦值的值.

2 全局(環境)變量 對所有終端都起效.已作為文件存在於電腦內.比如 $PATH

局部變量的賦值 可以是直接賦值,也可以引用或命令引用

直接賦值 變量名 = 變量值

a=abc

echo $a

變量引用賦值 變量名="引用的變量"

a="$PATHA"

echo $a

命令引用賦值 變量名=命令或$(命令)

a=ls -l

echo $a

顯示已賦值的所有變量 set+回車
刪除變量 unset+變量名

全局(環境)變量的賦值
用命令賦值:固定格式
declare -x+變量名=變量值 給全局變量賦值

declare -x也可以查看所有環境變量.與export一樣
env及printenv也能顯示已存在的環境變量。

刪除環境變量也可以使用 unset+變量名來實現

引用變量時候,變量值後面有別的字符串,為了確定變量值的範圍,會用大括號將取值範圍圈起來。

變量還可細分為只讀變量和位置變量

只讀變量:只能聲明,但不能修改和刪除

聲明只讀變量:
readonly name readonly -p+變量名,查看系統內置的只讀變量.

declare -r name 只讀變量會被子shell繼承當中的值,但是只讀屬性不繼承,舉例:

declare -r c=111 將變量c賦值為111且為只讀屬性,在當前bash中無法對變量c進行任何更改

declare -x |grep -w c 查看賦值的變量c

declare -rx c="111" 能看到c的變量還是為只讀屬性 rc

bash 切換到子bash

declare -x |grep -w c 再次查看賦值的變量c

declare -x c="111" 已經沒了只讀屬性.

查看只讀變量:
readonly –p
不管什麽類型的變量,只要退出shell都會被清除.

export +變量 設置全局變量,能被子shell所繼承其中的值。

位置變量 用於從命令行向Shell腳本傳遞參數,$1表示第1個參數、$2表示第2個參數等,$0為腳本的名字,
從${10}開始,參數號需要用花括號括起來,如${10}、${11}、${100}、…。$*和$@一樣,表示從$1開始的全部參數

位置變量中有一些特殊變量:
特殊變量 特殊的位置變量具有特殊的含義,其值不能由用戶重新設置。所有的預定義特殊變量都由$符號與
另一個符號組成,常用的預定義特殊變量如下所示。
$?, $0, $*, $@, $#,$$. 其中

$? 表示上一條命令執行後的退出狀態(返回值),為十進制數。一般命令執行成功返回值為0,錯誤值為非0.

$0 獲取當前執行腳本的文件名,包括路徑

$* 表示命令行中的所有位置參數組成的字符串,全部參數合為一個字符串.

$@ 表示命令行中的所有位置參數組成的字符串,但是每個參數都是獨立字符串.參數之間為或的關系.

$和$@看起來一樣,但是用$和$@分別將,第二個腳本的參數引用第一個腳本的參數時:
$*是引用第一個腳本的所有參數,參數是一個整體
而$@只引用第一個腳本的第一個參數.參數是獨立的個體.

$# 表示實際位置參數個數(不包括Shell腳本名)

$$ 表示當前進程號PID

$! 表示上一個後臺命令對應的進程號.

返回值: 腳本的返回值取決於腳本當中最後一個命令。
腳本運行失敗後,使用echo $?可以查看返回值.然後用vim進入腳本,搜索返回的值,就可以看到是因為什麽原因,
導致運行失敗了.返回值是可以自定義的,平時自己寫腳本時,在每條命令結果後補上exit+數字,就可以自定義了.
利用$?可以確認腳本報錯位置,幫助自己糾錯.

bash算法

bash中的算術運算:help let +,-, *, /, %取模(取余), **(乘方)
實現算術運算:
(1) let var=算術表達式

(2) var=$[算術表達式] 舉例 # a=$[3+2] # echo $a # 5

(3) var=$((算術表達式))

(4) var=$(expr arg1 arg2 arg3 ...)

(5) declare–i var = 數值

(6) echo ‘算術表達式’ | bc

echo "scale=10;2/3" |bc

0.6666666666

bc默認不保留小數點,可以事先定義小數點為位 scale=10 小數點後保留10位.
進制轉換 obase2是2進制,ibase10是10進制,先指定要轉換為幾機制,再指定由幾機制開始轉
obase與ibase的順序不能顛倒。

bc 進入計算模式

obase=2 指定轉換為二進制

ibase=10 由十進制開始轉換

10 輸入十進制10

1010 轉換為1010

obase=16;ibase=10

16

A A是16進制的10.

$RANDOM是隨機數變量,默認是0-9999,可以設置具體範圍.比如:

echo $[$RANDOM%50]:0-49之間隨機數.

一般作為抽獎系統來使用.

乘法符號有些場景中需要轉義 比如*,需要寫為
bash有內建的隨機數生成器:$RANDOM(0-32767)

echo $[$RANDOM%50]:0-49之間隨機數

declare -i +變量 可以將一個整數值賦給變量。bash中,不加此選項,也可以讀出來整數值。

增強型賦值 +=,-=, *=, /=, %= 代表著自加自減..再賦值的意思.

用 let 變量名+=數字 來表示

let num+=1 # let num+=2

echo #num # echo #num

1 # 2

let num+=1 # let num+=2

echo #num # echo #num

2 # 4

也可以寫為
num=$[$num+1]的形式.即 num=$[$num+1]=let num+=1
如果固定只加1的話,可以寫為 num++即可,同理 num--,也是固定減1

腳本的邏輯算法

1為真,0為假.

邏輯中的與和或

與代表著和的意思,a與b代表著a和b的意思.指定條件當中.a條件與b條件,
代表著a和b的條件必須同時滿足才可以.

或是或者的意思,a或b代表著a或者b的意思.指定條件當中.a條件或b條件,
代表著a和b的條件滿足一個就可以了.

真和假分別對應與和或的時候:

與的時候 或的時候
真與真為真 真與真為真
真與假為假 真與假為真
假與真為假 假與真為真
假與假為假 假與假為真

邏輯中的非:!
非真即假
非假即真

短路運算,這裏的短路指的是 條件在與和或之間的運算關系

短路運算

短路與
第一個條件為假,結果必定為假,所以後續條件無須再去判斷.
第一個為真的時候,第二個必須要參與運算.

短路或
第一個為真,結果必定為真.所以後續條件無須再去判斷.
第一個為假的時候,第二個必須要參與運算.

&&和||
&&符號是當前一個命令執行結果為真(成功)的時候,那麽接著執行&&後面的命令.而
||符號是當前一個命令執行結果為假(失敗)的時候,那麽接著執行||後面的命令.

腳本當中,()是將指定範圍作為一個整體來處理,而( &)不光將括號內作為一個整體,還
將其中的命令單獨放入一個shell中去運行,所以直接(exit)會退出當前終端,而( &)不會
退出當前終端。

異或:
^
異或的兩個值,相同為假,不同為真

使用read來把輸入值分配給一個或多個shell變量
read 後面的字符 都被視為變量,隨後鍵入的值就是該變量的值

read -p "請輸入用戶名" name後回車

此時提示輸入用戶名,輸入的值就是 變量name的值,接下來就可以使用$name來引用所鍵入的值了.

-p 指定要顯示的提示

-s 靜默輸入,一般用於密碼
不想讓人看到所輸入的密碼.可以在腳本中加入如下幾行:

stty -echo

read password

stty echo

echo stty命令不會換行,這一步作換行用。

或者 read -sp“輸入密碼”

-n N 指定輸入的字符長度N -N 5 指定輸入字符長度為5,輸入少於5個會等待,直到輸入第五個後自動結束。

-d ‘字符’ 輸入結束符

-t N TIMEOUT為N秒 -t 5 等待5秒。

read 從標準輸入中讀取值,給每個單詞分配一個變量
所有剩余單詞都被分配給最後一個變量

cat 123.txt 打開文件123。txr

a b c d 文件值為 a b c d

read A B < 123.txt 使用read從123.txt當中獲取變量A和B的值

echo $A 顯示A變量的值

a 變量值為a

echo $B 顯示B變量的

b c d 變量值為b c d,因為變量值存在多個,變量只有2個,剩余的變量都會被賦值到B變量上。

bash如何展開命令行

把命令行分成單個命令詞

展開別名

展開大括號的聲明 {}

展開波浪符聲明 ~

命令替換 $ 和 ``

再次把命令行分成命令詞

展開文件通配 *、?、[abc]等等

準備I/0重導向 <、>

運行命令

反斜線 \ 會使隨後的字符按原意解釋 一個\只會使一個,緊鄰著它的那個字符按願意解釋.

$ echo Your cost: \$5.00

Your cost: $5.00

加引號來防止擴展
單引號 ’防止所有擴展 ‘‘單引號內所有字符都將視為一個整體.
雙引號 ”也防止所有擴展,但是以下情況例外: ""雙引號內所有字符都將視為一個整體,除了這四種.
$(美元符號) - 變量擴展
`(反引號) - 命令替換
\(反斜線) - 禁止單個字符擴展
!(嘆號) - 歷史命令替換

bash的配置文件 按生效範圍劃分,存在兩類:

1 全局配置:/etc/profile /etc/profile.d/*.sh /etc/bashrc

2 個人配置: ~/.bash_profile 及 ~/.bashrc

這五個配置文件,系統啟動時讀取的順序根據啟動類型分為:

一、 交互式登錄
交互式登錄分為:
(1)直接通過終端輸入賬號密碼登錄
(2)使用“su - UserName” 切換的用戶
這時的執行順序:/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc
--> /etc/bashrc

其實在交互式登錄時候,只讀兩個文件/etc/profile和~/.bash_profil。

/etc/profile當中指向讀取 /etc/profile.d/*.sh當中所有以.sh結束的文件.

而~/.bash_profil當中,指向讀取~/.bashrc和/etc/bashrc

二、非交互式登錄
非交互式登錄分為:
(1)su UserName
su不加-就是僅切換到這個用戶上,這時上個用戶的變量值,umask值等都會保存下來,相當於一個繼承的子shell.
(2)圖形界面下打開的終端
(3)執行腳本
(4)任何其它的bash實例
這時的執行順序:~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh

/etc/bashrc中存在一個判斷,若用戶讀取過/etc/profile.d/.sh當中的文件,就不再讀取,沒有的話就去讀.
而非交互式登錄並沒有去讀,所有當讀取到/etc/bashrc時候,自動轉去/etc/profile.d/
.sh當中讀取文件.

按功能劃分,存在兩類:profile類和bashrc類

其中,profile類:為交互式登錄的shell提供配置全局:

/etc/profile, /etc/profile.d/*.sh

個人:~/.bash_profile

功用:
(1) 用於定義環境變量
(2) 運行命令或腳本

而bashrc類
為非交互式和交互式登錄的shell提供配置全局:/etc/bashrc

個人:~/.bashrc

功用:
(1) 定義命令別名和函數
(2) 定義本地變量

配置文件可以通過文本編輯工具,如nano,vim之類進行更改,通過配置文件可以添加別名,開機信息顯示等設置,
修改後的profile和bashrc不會立即勝過,需要立即生效兩種方法:

1重新啟動shell進程
2 使用.+profile或.+~/.bashrc 或source+profile或~/.bashrc

比如:
. ~/.bashrc 或 source profile 都可以使改過的文件立即生效.

想使修改的配置,無論是交互還是非交互登錄都有效果,那麽就把修改內容放在/etc/profile.d/*.sh當中去.
而如果想使修改過的變量,只能自己使用,其他人不可見的話,那麽家目錄下的.bashrc是最好的選擇.

直接運行腳本,相當於又開了一個子shell來啟動,裏面的變量值不能被當前shell所用.
若想對當前shell起效.最好使用sorce或.+腳本名字來啟動,這樣進程還是是在當前shell進程下.

而在腳本中設置的變量值,回到當前shell中,也不會影響當前shell,運行腳本就相當於單獨開了一個shell.

bash在退出時,會執行如下操作

1 保存在~/.bash_logout文件中(用戶)
2 在退出登錄shell時運行
3 用於
4 創建自動備份
5 清除臨時文件

可以在這個文件中編輯如下命令 rm -rf /var/log/messages
這樣可以清除自己在這臺電腦上的痕跡.

特殊變量$- 它的值為

himBH,分別對應如下

h:hashall,打開這個選項後,Shell 會將命令所在的路徑hash下來,避免每次都要查詢。通過
set +h將h選項關閉

i:interactive-comments,包含這個選項說明當前的 shell 是一個交互式的 shell。所謂的交互
式shell,在腳本中,i選項是關閉的。

m:monitor,打開監控模式,就可以通過Job control來控制進程的停止、繼續,後臺或者前臺執
行等。

B:braceexpand,大括號擴展 set +B後,echo {1..100}不再擴展大括號了,只會顯示{1..100}

H:history,H選項打開,可以展開歷史列表中的命令,可以通過!感嘆號來完成,例如“!!”返回
上最近的一個歷史命令,“!n”返回第 n 個歷史命令

馬哥學習李洋個人筆記之shell腳本簡介