天天看點

Linux shell基礎和變量

0x00、shell

shell是一個指令解釋器,它為使用者提供一個向linux核心發送請求以便運作程式的界面系統即程式,使用者可以用shell來啟動、挂起、停止甚至是編寫一些程式。

硬體——核心——shell指令解釋器——外層應用程式

最底層是硬體,通過核心來管理硬體,但是通過外層的應用程式或者認為敲入指令,核心是無法識别的,我們輸入的指令是一串ascii字元串,而計算機能識别的是01機器語言,他們之前需要轉換。shell主要就是用于轉換。

shell除了做指令解釋器之外,shell還是一個功能相當強大的程式設計語言,易編寫。易調試,靈活性較強。shell是解釋執行的腳本語言,在shell中可回憶直接調用linux系統指令。

shell的分類

Bourne shell:從1979年期Unux就開始使用Bourne shell,Bourne shell的主檔案名為sh。

C Shell:C Shell主要在BSD版的Unix系統中使用,其文法和C語言相類似而得名。

shell的兩種主要文法類型有Bourne和C,這兩種文法彼此不相容,Bourne家族主要包括sh、ksh、Bash、psh、zsh,C家族主要包括csh、tcsh

Bash:Bash與sh相容,現在使用的linux就是使用bash作為使用者的基本shell。

vim /etc/shells查詢linux支援的shell。

<a href="http://s4.51cto.com/wyfs02/M01/88/77/wKiom1f4oQaRDX32AAALIW0Xh3Q912.png" target="_blank"></a>

#!/bin/bash (#!是一個特殊的表示符,其後,跟着解釋此腳本的shell路徑。隻能放在第一行,不是注釋,代表一下寫的是shell程式,後面再跟的#隻能看作注釋)

echo “hello world”

0x01、執行腳本

寫完的shell腳本,需要去運作,常用的有一下兩種。

1.賦予執行權限,直接運作

chmod 755 1.sh

./1.sh(相對路徑和絕對路徑都可)

2.通過bash調用執行腳本

bash 1.sh

0x02、曆史指令的調用

使用上下鍵調用以前使用的曆史指令

使用!n重複執行第n條曆史指令

使用!!重複執行上一條指令

使用“!字元串”重複執行最後一條已該字元串結尾的指令

0x03、别名的使用

别名 (别名最大的好處就是讓指令按照自己的習慣使用)

alias 别名=‘原指令’ 設定指令别名 (重新開機消失)

unalias 别名   删除别名

vim /root/.bashrc 讓别名永久生效

alias 查詢指令别名

指令執行順序:

第一順位執行要用絕對路徑或相對路徑執行的指令。

第二順位執行别名

第三順位執行bash的内部指令

第四順位執行按照$PATH環境變量定義的目錄查找順序找到的第一個指令。

bash常用快捷鍵

Ctrl + C:強制終止目前指令

Ctrl + L:清屏,相當于clear指令。

Ctrl + U:删除或剪貼光标之前的指令。

Ctrl + Y:粘貼Ctrl + U或Ctrl + K剪貼的内容。

Ctrl + R:在曆史記錄中搜尋。

Ctrl + D:退出目前終端。

0x04、多指令順序執行

;多個指令順序執行,指令之間沒有任何邏輯聯系

&amp;&amp; 邏輯與,目前一條指令執行正确的時候才會執行後面的指令(./configure &amp;&amp; make &amp;&amp; make install)

|| 邏輯或,目前一條指令隻想能夠不正确的時候才會執行後一條指令 (指令 &amp;&amp; echo yes || echo no)

0x05、通配符和特殊符号

通配符

? 比對一個任意字元

*  比對0個或多個任意字元,也就是可以比對任何内容。

[]  比對中括号中任意一個字元。如[abc]代表一定比對一個字元,或者a,或者b,或者c

[-]  比對中括号中任意一個字元,-代表一個範圍。如[a-z]代表比對一個小寫字母。

[^]  邏輯非,表示比對不是中括号内的一個字元。如[^0-9]代表比對一個不剩數字的字元。

bash中其他特殊符号

‘’單引号:在單引号中所有的特殊符号,如$和、都是沒有特殊含義的。

“”雙引号:在雙引号中特殊符号都沒有特殊含義,但是$ ` \ 是例外,擁有調用變量的值、引用指令和轉義的特殊含義。

``反引号:反引号括起來的内容是系統指令,在bash中會先執行它,和$()作用一樣。

#:在shell中,#開頭的行代表注釋。

$:用于調用變量的值,如需要調用變量name的值時,需要用$name的方式得到變量的值。

\轉義符:跟在\之後的特使符号将失去特殊含義,變為普通字元。如\$将輸出$符号,而不當做是變量引用。

單引号和雙引号的差別在于有些特殊字元,雙引号有特殊含義,而單引号沒有

<a href="http://s3.51cto.com/wyfs02/M01/88/73/wKioL1f4oTHDkK8sAAAO6pHZm5A285.png" target="_blank"></a>

$()括起來的内容是系統指令,在bash中會先執行它

<a href="http://s2.51cto.com/wyfs02/M00/88/77/wKiom1f4oVOSsCmhAAAdvDUn1gI111.png" target="_blank"></a>

0x06、變量

變量是計算機記憶體的單元,其中存放的值可以改變,當shell腳本需要儲存一些資訊時,如一個檔案名或一個數字,就把它存放在一個變量中。每個變量有一個名字,是以很容易引用它。使用變量可以儲存有用的資訊,使系統獲知使用者相關設定,變量也可以用于儲存暫時資訊。

變量設定規則

變量名稱可以由字母、數字和下劃線組成,但是不能以數字開頭。

在bash中,變量的預設類型都是字元串型,如果要進行數值運算,則必須指定變量類型為數值型。

變量用等号連接配接值,等号左右兩側不能有空格。

變量的值如果有空格,需要使用單引号或者雙引号包括。

在變量的值中,可以使用“\”轉義符。

如果需要添加變量的值,那麼可以進行變量值的疊加。不過變量需要用雙引号包含“$變量名”或${變量名}包含。

如果是把指令的結果作為變量值賦予變量,則需要使用反引或$()包含指令。

環境變量名建議大寫,便于區分。

變量分類

使用者自定義變量

變量的名,變量的内容和作用都可以自己定義。

環境變量

這種變量中主要儲存的是和系統操作環境相關的資料。

位置參數變量

這種變量主要是用來向腳本當中傳遞參數或資料的,變量名不能自定義,變量作用是固定的。

預定義變量

是bash中已經定義好的變量。變量名不能自定義,變量作用也是固定好的。

本地變量定義

本地變量在使用者現在的shell生命期的腳本中使用。這個值隻在使用者目前shell生命期有意義。如果在shell中啟動另一個程序或退出,此值将無效。這個方法的優點就是使用者不能對其他的shell或程序設定此變量有效。

name=wt

變量疊加:

name=”$aa”456

name=$(aa)789

變量調用

使用echo指令可以顯示單個變量取值,并在變量名前加$

echo $name

變量檢視

set(檢視所有變量)

變量删除

使用unset指令清除變量。

unset name

系統環境變量,變量名稱是固定的,更改則失去作用了,但是可以修改值,環境變量的作用也是固定的,但是允許手工添加環境變量

使用者自定義變量隻在目前的shell中生效,而環境變量會在目前shell和這個shell的所有子shell當中生效。如果把環境變量寫入相應的配置檔案,那麼這個環境變量就會在所有的shell中生效。

設定環境變量

export 變量名=變量值  (申明變量)

set  查詢所有變量

env  查詢環境變量

unset  變量名  (删除變量)

pstree 通過樹結構檢視目前的所有的父shell和子shell

<a href="http://s5.51cto.com/wyfs02/M00/88/77/wKiom1f4oXbzw1jJAAAewoaFJQU240.png" target="_blank"></a>

系統常見環境變量

PATH:系統查找指令的路徑

<a href="http://s3.51cto.com/wyfs02/M00/88/73/wKioL1f4oZbQw5zPAAETR3hcZO8333.png" target="_blank"></a>

在linux中,執行檔案要運作,不管是系統的執行檔案,還是自己寫的腳本,都必須用絕對路徑和相對路徑,但是系統指令并沒有寫指令就可以運作,就是因為環境變量的存在,新敲一個指令,它會現在這些系統的環境變量的路徑中找,在所有的路徑都沒有找到,系統就會報錯。 

建立個hello.sh的腳本,通過cp指令複制到path下的任意一個路徑中,就不用寫路徑可以直接運作,但是并不建議,建議用疊加的方式。

PATH=”PATH”:/root

<a href="http://s2.51cto.com/wyfs02/M00/88/73/wKioL1f4ocfS6pVpAABF7DquH0I387.png" target="_blank"></a>

0x07、位置參數變量

作用

$n

n為數字,$0代表指令本身,$1-$9代表第一到第九個參數,十以上的參數需要用大括号包含,如${10}

$*

這個變量代表指令行中所有的參數,$*把所有的參數看成一個整體

$@

這個變量也代表指令行中所有的參數,不過$@把每個參數區分對待

$#

這個變量代表指令中所有參數的個數

$*和$@的差別

<a href="http://s2.51cto.com/wyfs02/M01/88/77/wKiom1f4ofCjKzGaAAA3LxRbyic773.png" target="_blank"></a>

主要還是用來區分往腳本傳的參數是獨立的還是整體的,$*把所有參數當作一個整理,$@把每個參數當作一個變量

0x08、預定義變量

位置變量隻是預定義變量其中的一種,隻是内容比較多,單獨拿出來

$?

最後一次執行的指令的傳回狀态,如果這個變量的值為0,證明上一個指令正确執行;如果這個變量的值非0(具體是哪個數,由指令自己來決定),則證明上一個指令執行不正确了

$$

目前程序的程序号(PID)

$!

背景運作的最後一個程序的程序号(PID)

&amp;&amp;,前一條指令正确執行,才能執行後一條指令,||,前一條指令錯誤執行,才執行後一條指令,歸根到底還是判斷$?是否為0,來判斷前一條指令是否正确

<a href="http://s3.51cto.com/wyfs02/M01/88/73/wKioL1f4ohqQMcEOAAAlfBqcIAg114.png" target="_blank"></a>

find /root -name canshu1.sh &amp; 中的&amp;加上則表示背景的意思

0x09、數值運算與運算符

declare聲明變量類型

declare【+/-】【選項】【變量】

-給變量設定類型屬性

+取消變量的類型屬性

-i将變量聲明為整數型

-x将變量聲明為環境變量

-p顯示指定變量的被聲明的類型

一:用declare将變量聲明為數值型

二:使用expr或let工具進行

三:把運算符用$(()),即$雙小括号括起來

<a href="http://s3.51cto.com/wyfs02/M00/88/77/wKiom1f4ojvwzNGHAABBsCYxFTE970.png" target="_blank"></a>

0x10、運算符

優先級

運算符

說明

13

-,+

單目負、單目正

12

!,~

邏輯非、按位取或補碼

11

*,/,%

乘,除,取模

10

+,-

加、減

9

&lt;&lt;,&gt;&gt;

按位左移、按位右移

8

&lt;=,&gt;=,&lt;,&gt;

小于或等于、大于或等于、小于、大于

7

==,!=

等于、不等于

6

&amp;

按位與

5

^

按位異或

4

|

按位或

3

&amp;&amp;

邏輯與

2

||

邏輯或

1

=,+=,-=,*=,/=,%=,^=,|=,&lt;&lt;=,&gt;&gt;=

指派、運算且指派

0x11、環境變量配置檔案

環境變量配置檔案中主要是定義對系統的操作環境生效的系統預設環境變量,比如PATH、HISTSIZE、PSI、HOSTNAME等預設環境變量。

/etc/profile

~/.bash_profile

~/.bashrc

/etc/bashrc

/etc/profile.d/*.sh

/etc/profile的作用

USER變量

LOGNAME變量

MAIL變量

PATH變量

HOSTNAME變量

HISTSIZE變量

umask:

調用etc/progile.d/*.sh檔案

~/.bash_profile的作用

調用了~/.bashrc檔案

在PATH變量後加入了”$HOME/bin”這個目錄

~/.bashrc的作用

定義了系統預設别名

調用/etc/bashrc

/etc/bashrc的作用

(不輸入使用者名密碼,直接登入的環境變量)

PSI變量

umask

需要注意的是,寫在後面的會覆寫前面的環境變量

本文轉自 wt7315 51CTO部落格,原文連結:http://blog.51cto.com/wt7315/1859413

繼續閱讀