1. 程式人生 > 其它 >Shell基本操作與命令

Shell基本操作與命令

Shell基本操作與命令

(原創內容,轉載請註明來源,謝謝)

本文主要是我最近學習shell語言的學習筆記,主要在於通過學習這些內容,達到看得懂shell指令碼、理解其與PHP的區別、編寫簡單指令碼的目的。

1、#!/bin/sh

放在程式開頭,表示用/bin/sh方式來解析。

2、變數

1)變數賦值 varname=’xxx’,除了在變數賦值和在FOR迴圈語句頭中,其他情況下BASH 中的變數使用必須在變數前加"$"符號,即採用 $varname使用變數。更為標準的變數引用方式是 ${STR} 這樣的,$STR 自不過是對 ${STR} 的一種簡化。在複雜情況下(即有可能產生歧義的地方)最好用帶 {} 的表示方式。

2)給變數賦值時,等於號=兩邊都不能有空格。

3)local定義區域性變數,export定義全域性變數。

4)保留變數:

$IFS  這個變數中儲存了用於分割輸入引數的分割字元,預設是空格。

$HOME  這個變數中儲存了當前使用者的根目錄路徑。

$PATH  這個變數中儲存了當前 Shell 的預設路徑字串。

$PS1  表示第一個系統提示符。

$PS2  表示的二個系統提示符。

$PWD  表示當前工作路徑。

$EDITOR 表示系統的預設編輯器名稱。

$BASH  表示當前 Shell 的路徑字串。

$RANDOM 隨機的生成一個大小在 1 到 65536 之間的整數。

5)變數的特殊操作:

${var-default} 表示如果變數 $var 還沒有設定,則保持 $var 沒有設定的狀態,並返回後面的預設值 default。

${var=default} 表示如果變數 $var 還沒有設定,則取後面的預設值 default。

${var+otherwise}表示如果變數 $var 已經設定,則返回 otherwise 的值,否則返回空( null )。

${var?err_msg} 表示如果變數 $var 已經設定,則返回該變數的值,否則將後面的 err_msg 輸出到標準錯誤輸出上。

${var#pattern},${var##pattern} 用於從變數 $var 中剝去最短(最長)的和 pattern 相匹配的最左側的串。

${var%pattern},${var%%pattern} 用於從變數 $var 中剝去最短(最長)的和 pattern 相匹配的最右側的串。

${var:pos} 表示去掉變數 $var 中前 pos 個字元。

${var:pos:len} 表示變數 $var 中去掉前 pos 個字元後的剩餘字串的前 len 個字元。

${var/pattern/replacement}表示將變數 $var 中第一個出現的 pattern 模式替換為 replacement 字串。

${var//pattern/replacement}表示將變數 $var 中出現的所有 pattern 模式全部都替換為 replacment 字串。

3、&& 和 || 以及 |

1)a && b 表示先執行a,成功再執行b。

2)a||b表示執行a,成功就不執行b,否則執行b。

3)a|b 表示先執行a,執行的結果用在執行b的過程。

4、特殊符號

1)# 用於開頭表示定義,用於其他行的行首表示本行註釋不執行

2); 多個語句放在同一行用此分隔。

3);; 在使用case時,作為每個選項的結束。

varname=b 
case "$varbname" in 
[a-z]) echo "abc";;
[0-9]) echo "123";;
esac

4)單引號和雙引號:同php

5)` (反引號),將命令執行的結果輸出到變數。

cp `mkdir back` test.sh back ,反引號中的先執行,然後執行拷貝cp命令。

6):

1. 空命令 bash的一個內建命令,退出碼是0。與 true作用相同。

2. 變數擴充套件/字串替換 : > 檔案 清空了這個檔案 和 cat 、dev/null 檔案 作用相同。但用 :不會產生新程序,因為是內建命令。

7)小括號 ()

1. 命令組,將括號內部的命令當做子shell,對指令碼剩餘部分不可用,變數存在作用域的問題。下列輸出的結果是123,即小括號內的在小括號外沒用。

a=123  
( a=321;)  
echo "a =$a"

2. 初始化陣列:arr=(1 3 5 7 9)

8)大括號{}

1. 檔名擴充套件 cp t.{txt,bak} 複製 t.txt 的內容到 t.bak 中

2. 程式碼塊,和小括號相反,大括號外面仍然可以使用裡面的變數。下面輸出321。

a=123  
{ a=321;}  
echo "a =$a"

9)中括號[]

1. if等條件放在中括號中 if [ $a -gt 10 ] ,方括號兩邊需要留空格。

2. 用來引用陣列元素,同PHP

10)<、>與<<、>>

首先,兩個符號和一個符號的相比,兩個符號的是輸出內容追加到檔案後面,一個符號的意思是直接輸出到檔案(覆蓋原來的內容)。

其次,符號表示重定向,大於小於用-gt和-lt。

例子:sort >>name.txt <<hello

1. sort>>name.txt 將sort命令的結果遮蔽輸出並重定向追加到name.txt檔案尾部(重定向標準輸出)。

2. name.txt<<hello執行name.txt,以hello作為所需要的輸入內容(重定向標準輸入)。

附加內容:

linux輸入輸出三種標準:標準輸入、標準輸出、標準錯誤輸出,分別是0/1/2,組合起來使用是 sort > name.txt 即sort 1> name.txt,但是要講錯誤輸出則用sort 2> name.txt,會把內容輸出到name.txt。如果要同時將標準輸出和標準錯誤輸出都輸出,則需要sort > name.txt 2>& 1,或者使用sort >& name.txt。

11) .

讀取並執行.sh檔案,且是在當前shell下執行(./xxx.sh是在子shell下執行)

5、$

1)$$ 當前Shell程序的ID

2)$0 當前指令碼的檔名

3)$n 傳遞給指令碼或函式的引數。n 是一個數字,表示第幾個引數。例如,第一個引數是$1,第二個引數是$2。最多到9,第十個無法用$10獲取,需要儲存$1以後,用shift命令把第一個變數剔除,則此時$9就是輸入的第十個變數。

4)$# 傳遞給指令碼或函式的引數個數。

5)$* 傳遞給指令碼或函式的所有引數。

6)$@ 傳遞給指令碼或函式的所有引數。被雙引號(" ")包含時,與 $* 稍有不同。"$*" 會將所有的引數作為一個整體,以"$1 $2 … $n"的形式輸出所有引數;"$@" 會將各個引數分開,以"$1" "$2" … "$n" 的形式輸出所有引數。

7)$? 上個命令的退出狀態,或函式的返回值。

6、判斷

執行man test可以檢視所有測試表達式可以比較和判斷的型別。

-e 檔案已經存在

-f 檔案是普通檔案

-s 檔案大小不為零

-d 檔案是一個目錄

-r 檔案對當前使用者可以讀取

-w 檔案對當前使用者可以寫入

-x 檔案對當前使用者可以執行

-g 檔案的 GID 標誌被設定

-u 檔案的 UID 標誌被設定

-O 檔案是屬於當前使用者的

-G 檔案的組 ID 和當前使用者相同

file1 -nt file2檔案 file1 比 file2 更新

file1 -ot file2檔案 file1 比 file2 更老

file1 -ef file2檔案 file1 是 file2 的硬連結

如 if [ -x /root ] 可以用於判斷 /root 目錄是否可以被當前使用者進入

對應的操作整數操作字串操作

相同 -eq =

不同 -ne !=

大於 -gt >

小於 -lt <

大於或等於 -ge

小於或等於 -le

為空 -z

不為空 -n ,建議使用 ! -z 代替

上次讀過之後做過修改 -N

比如:

比較整數 a 和 b 是否相等就寫做 if [ $a = $b ]

判斷整數 a 是否大於整數 b 就寫做 if [ $a -gt $b ]

比較字串 a 和 b 是否相等就寫作:if [ $a = $b ]

判斷字串 a 是否為空就寫作: if [ -z $a ]

判斷整數變數 a 是否大於 b 就寫作:if [ $a -gt $b ]

注意:在“[”和“]”符號的左右都留有空格。

7、除錯

sh -nyour_script 不需要執行指令碼只是檢查語法的模式,返回所有語法錯誤。

sh -x strangescript 執行該指令碼並顯示所有變數的值。

8、[[]]與[]區別

1)數字測試: -eq -ne -lt -le -gt -ge,[[ ]]同 [ ]一致 2)檔案測試: -r、-l、-w、-x、-f、-d、-s、-nt、-ot,[[ ]]同 [ ]一致 3)字串測試: > < =(同==) != -n -z,不可使用“<=”和“>=”,[[ ]]同 [ ]一致,但在[]中,>和<必須使用進行轉義,即>和< 4)邏輯測試: []為 -a -o ! [[ ]] 為&& || ! 5)數學運算: [] 不可以使用 [[ ]]可以使用+ - * / % 6)組合:均可用各自邏輯符號連線的數字(運算)測試、檔案測試、字元測試

兩個使用時都需要用空格分隔運算子和值。

9、(())

專門來做數值運算,如果表示式求值為 0,則設定退出狀態為 1;如果求值為非 0 值,則設定為 0。不需要對 (( 和 )) 之間的操作符轉義。算術只對整數進行。除 0 會產生錯誤,但不會產生溢位。可以執行 C 語言中常見的算術、邏輯和位操作。

下面兩種方法都輸出100:

((i=1+99));echo $i

i=99;((i++));echo $i

這種方法下符號和值不要有空格,和[[]]不一樣。

10、&

命令末尾的&,表示採用非阻塞的方式執行命令,即不必等待執行結果,可以一邊執行該行命令一邊往下執行。

11、函式

求函式的定義必須在函式使用之前。

函式引數的定義並不需要在函式定義處就制定,而只需要在函式被呼叫時用 BASH 的保留變數 $1 $2 ... 來引用就可以了。

BASH 的返回值可以用 return 語句來指定返回一個特定的整數,如果沒有 return 語句顯式的返回一個返回值,則返回值就是該函式最後一條語句執行的結果(一般為 0,如果執行失敗返回錯誤碼)。BASH 要求返回值必須為一個整數,不能用 return 語句返回字串變數。

函式的返回值在呼叫該函式的程式體中通過 $? 保留字來獲得。

例如:

square() { 
let "res = $1 * $1" 
return $res 
} 
square $1 
result=$? 

12、select

BASH 中提供了一個小的語句格式,可以讓程式快速的設計出一個字元介面的使用者互動選擇的選單,該功能就是由 select 語句來實現的,select 語句的語法為:

xxx=’a b c’
select var in $xxx
do
statments use $var
done

上面的語法結構在執行後,BASH 會將$xxx中的所有項加上數字列在螢幕上等待使用者選擇,在使用者作出選擇後,變數 $var 中就包含了那個被選中的字串,然後就可以對該變數進行需要的操作了。

13、read

等待使用者的輸入,並將使用者輸入的結果作為變數。

read NAME 
echo "Hi! $NAME !"

此文章重點在於對shell的學習與複習,並且當作shell字典來使用,涵蓋大部分shell的常用寫法,在需要的時候可以及時檢視。

——written by linhxx 2017.07.28