linux shell 学习小结
學習內容:https://www.linuxdaxue.com/series/linux-shell-series/
個人筆記如下
1、“#!” 是一個約定的標記,它告訴系統這個腳本需要什么解釋器來執行,即使用哪一個Shell來執行。
ex:?
#!/bin/bash echo "Hello World !"2、chmod +x ./test.sh 使腳本具有執行權限
或者通過chmod 775?./test.sh
或者直接執行bash test.sh
3、交互式輸入通過read
#!/bin/bash echo "What is your name?" read PERSON echo "Hello, $PERSON"4、Shell將其中任何設置都看做文本字符串。有兩種變量,本地和環境。
定義變量:
注意,變量名和等號之間不能有空格,這可能和你熟悉的所有編程語言都不一樣。同時,變量名的命名須遵循如下規則:
- 首個字符必須為字母(a-z,A-Z)。
- 中間不能有空格,可以使用下劃線(_)。
- 不能使用標點符號。
- 不能使用bash里的關鍵字(可用help命令查看保留關鍵字)。
使用變量:$變量,使用變量的時候才加美元符($)
使用 readonly 命令可以將變量定義為只讀變量,只讀變量的值不能被改變。
使用 unset 命令可以刪除變量。語法:
unset variable_name變量被刪除后不能再次使用;unset 命令不能刪除只讀變量。
使用set命令顯示所有本地定義的Shell變量
5、Shell特殊變量,$0, $#, $*, $@, $?, $$
| 名稱 | 含義 |
| $0 | 當前腳本的文件名 |
| $# | 傳遞給腳本或函數的參數個數。 |
| $* | 傳遞給腳本或函數的所有參數。 |
| $@ | 傳遞給腳本或函數的所有參數。被雙引號(" ")包含時,與 $* 稍有不同,下面將會單獨講到。 |
| $? | 上個命令的退出狀態,或函數的返回值。 |
| $$ | 當前進程的ID。對于 Shell 腳本,就是這些腳本所在的進程ID |
| $n | 傳遞給腳本或函數的參數。n 是一個數字,表示第幾個參數。例如,第一個參數是$1,第二個參數是$2 |
$* 和 $@ 的區別
$* 和 $@ 都表示傳遞給函數或腳本的所有參數,不被雙引號(" ")包含時,都以"$1" "$2" … "$n" 的形式輸出所有參數。
但是當它們被雙引號(" ")包含時,"$*" 會將所有的參數作為一個整體,以"$1 $2 … $n"的形式輸出所有參數;"$@" 會將各個參數分開,以"$1" "$2" … "$n" 的形式輸出所有參數。
6、Shell字符串的操作
加單引號的特點:
- Shell單引號里的任何字符都會被原樣輸出,單引號字符串中的變量無效;
- Shell單引號字串中不能出現單引號(對單引號使用轉義符也不行)。
加雙引號的優點:
- Shell雙引號里可以有變量
- Shell雙引號里可以出現轉義字符
| ${#string} | $string的長度 |
| ${string:position} | 在$string中, 從位置$position開始提取子串 |
| ${string:position:length} | 在$string中, 從位置$position開始提取長度為$length的子串 |
| ${string#substring} | 從變量$string的開頭, 刪除最短匹配$substring的子串 |
| ${string##substring} | 從變量$string的開頭, 刪除最長匹配$substring的子串 |
| ${string%substring} | 從變量$string的結尾, 刪除最短匹配$substring的子串 |
| ${string%%substring} | 從變量$string的結尾, 刪除最長匹配$substring的子串 |
| ${string/substring/replacement} | 使用$replacement, 來代替第一個匹配的$substring |
| ${string//substring/replacement} | 使用$replacement, 代替所有匹配的$substring |
| ${string/#substring/replacement} | 如果$string的前綴匹配$substring, 那么就用$replacement來代替匹配到的$substring |
| ${string/%substring/replacement} | 如果$string的后綴匹配$substring, 那么就用$replacement來代替匹配到的$substring |
shell 字符串下標同python。從0開始編號,
${test##*/},${test%/*} 分別是獲取文件名,或者目錄地址最簡單方法。
字符串的替換
test='c:/windows/boot.ini' echo ${test/\//\\} echo ${test//\//\\}7、Shell數組
在Shell中,用括號來表示數組,數組元素之間用“空格”分割開。array_name=(value1 ... valuen)
${array_name[index]},使用@ 或 * 可以獲取數組中的所有元素
8、echo命令使用單引號“’”可以保持原樣輸出,不會對內容進行處理
printf使用同C的printf,Shell printf命令與C語言printf命令的區別。
- printf 命令不用加括號
- format-string 可以沒有引號,但最好加上,單引號雙引號均可。
- 參數多于格式控制符(%)時,format-string 可以重用,可以將所有參數都轉換。
- arguments 使用空格分隔,不用逗號。
?
9、
Shell 有三種 if else格式:
if ... else 語句也可以寫成一行,以命令的方式來運行,像這樣:
if test $[2*3] -eq $[1+5]; then echo 'The two numbers are equal!'; fi;test 命令用于檢查某個條件是否成立,與方括號([ ])類似。
num1=$[2*3] num2=$[1+5] if test $[num1] -eq $[num2] thenecho 'The two numbers are equal!' elseecho 'The two numbers are not equal!' fi?
10、
for 變量 in 列表 docommand1...commandN done列表是一組值(數字、字符串等)組成的序列,每個值通過空格分隔。每循環一次,就將列表中的值依序放入指定的變量中,然后重復執行命令區域(在do和done 之間),直到所有元素取盡為止。
可以顯示當前目錄下的文件
for file in ./* doecho $file done?
11、while
COUNTER=0 while [ $COUNTER -lt 5 ] doCOUNTER=`expr $COUNTER+1`echo $COUNTER donelt ---小于
while read txt1 doecho ${txt1} done < /home/study/study/infile說明:這個例子使用read在標準輸入讀取數據,放入變量txt1中,如果讀到的數據非空,就進入循環。然后在循環中把該行數據顯示出來。最后一樣是輸入重定向,將/home/study/study/infile的內容作為此腳本的標準輸入。
注:>是輸出內容到某個文件,>>是內容追加到文件中,
命令默認從鍵盤獲得的輸入,重定向(<)后改為從文件,或者其它打開文件以及設備輸入。這樣,本來需要從鍵盤獲取輸入的命令會轉移到文件讀取內容。
until和while類似,不同在于command 如果返回值為 false,則繼續執行循環體內的語句,否則跳出循環。
ex:
COUNTER=0 until [ ! $COUNTER -lt 5 ] doCOUNTER=`expr $COUNTER + 1`echo $COUNTER done?
12、Shell分支語句case···esac語法
case 值 in 模式1)command1command2command3;; 模式2)command1command2command3;; *)command1command2command3;; esaccase后為取值,值后為關鍵字 in,接下來是匹配的各種模式,每一模式最后必須以右括號結束。
值可以為變量或常數。
模式支持正則表達式,可以用以下字符:
* 任意字串 ? 任意字元 [abc] a, b, 或c三字元其中之一 [a-n] 從a到n的任一字元 | 多重選擇匹配發現取值符合某一模式后,其間所有命令開始執行直至 ;;。
;; 與其他語言中的 break 類似,意思是不執行接下來的語句而是跳到整個 case 語句的最后。
*)與default相似,如果上面沒有匹配到的模式,則執行*)里的內容。
?
13、Shell Select語句語法
select name [in list ] do statements that can use $name... done說明:select首先會產生list列表中的菜單選項,然后執行下方do…done之間的語句。用戶選擇的菜單項會保存在$name變量中。
PS3='Please choose your number: ' # 設置提示符字串. echo select number in "one" "two" "three" "four" "five" do echo echo "Your choose is $number." echo break done exit 014、shell function
Shell 函數的定義格式如下:
[ function ] funname [()] {command;[return int;] }說明:function?關鍵詞是可選項,可加可不加。
大括號內飾函數體,最后是返回值,可以加【return】關鍵詞來指定函數返回內容,如果不加,將以最后一條命令運行結果,作為返回值。 return后跟數值n(0-255)。
在Shell中,調用函數時可以向其傳遞參數。
在函數體內部,通過 $n 的形式來獲取參數的值,例如,$1表示第一個參數,$2表示第二個參數,$0代表腳本本身。
| 參數 | 說明 |
| $# | 傳遞到腳本的參數個數 |
| $* | 以一個單字符串顯示所有向腳本傳遞的參數 |
| $$ | 腳本運行的當前進程ID號 |
| $! | 后臺運行的最后一個進程的ID號 |
| $@ | 與$*相同,但是使用時加引號,并在引號中返回每個參數。 |
| $- | 顯示Shell使用的當前選項,與set命令功能相同。 |
| $? | 顯示最后命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤。 |
這個定義了一個計算參數和的函數,函數可以通過$1,$2這種形式來獲取入參值,然后通過$(($1+$2))這種形式來將兩值相加,并返回結果。
調用時,也可以通過括號的形式來調用,Shell會調用單括號里面的命令。 因此,我們可以將shell中函數,看作是定義一個新的命令,它是命令,因此 各個輸入參數直接用 空格分隔。
注意,$10 不能獲取第十個參數,獲取第十個參數需要${10}。當n>=10時,需要使用${n}來獲取參數。
15、輸出重定向的詳細說明
| 命令格式 | 命令說明 |
| Command > filename | 把標準輸出重定向到一個文件中 |
| Command > filename 2>&1 | 把標準輸出和錯誤一起重定向到一個文件中 |
| Command 2 > filename | 把標準錯誤重定向到一個文件中 |
| Command 2 >> filename | 把標準輸出重定向到一個文件中(追加) |
| Command >> filename2>&1 | 把標準輸出和錯誤一起重定向到一個文件(追加) |
上文中已經說到,Linux文件描述符中,2代表標準錯誤?,F在講下如何將標準錯誤進行重定向。
使用方法:
command > out.put 2>&1 將command執行的標準輸出和標準錯誤重定向到out.put(也就是說不管command執行正確還是錯誤,輸出都打印到out.put)。還可以將錯誤輸出重定向到/dev/null,意思是丟棄這部分輸出,如下:
command 2> /dev/null 如果command執行出錯,將錯誤的信息重定向到空設備(忽略掉錯誤輸出)16、Shell文件包含就是在一個文件調用另外一個文件,使用點號“.”+文件名 或者source+文件名
ex:
num1.sh
num1=1 num2=2num2.sh
. num1.sh echo "num1 = "$num1 echo "num2 = "$num2?
?
?
?
?
總結
以上是生活随笔為你收集整理的linux shell 学习小结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux ls
- 下一篇: linux time shell统计脚本