為什麼使用shell 可以快速、簡單的完成編程,實現自己的想法。Shell非常適合編寫小的工具,因為小工具更強調的是易於配置、維護、移植等,而不是執行效率。 當自己的想法確實有必要進行優化,有必要讓它更容易修改以及修正設計目的時,可以將shell編寫的工具重新用C、C++/python等語言重新實現 ...
為什麼使用shell
可以快速、簡單的完成編程,實現自己的想法。Shell非常適合編寫小的工具,因為小工具更強調的是易於配置、維護、移植等,而不是執行效率。
當自己的想法確實有必要進行優化,有必要讓它更容易修改以及修正設計目的時,可以將shell編寫的工具重新用C、C++/python等語言重新實現。
常見的shell有bash/csh/sh等
管道和重定向
ls -al > lsoutput.txt #將ls命令輸出的內容重定向到txt文件 在>前加數字 0 1 2 分別代表輸入、標準輸出、錯誤輸出
參數2可以將錯誤輸出到文件 而標準輸出的內容將顯示在屏幕上
>> #將輸出添加到文件
丟棄不需要保存的輸出的方法
Kill -l 1234 >/dev/null 2>&1 #將標準輸出與錯誤輸出都丟棄到系統垃圾箱
| 管道 用來連接進程 通過管道連接的進程可以同時運行,並自動協調數據流
1 Ps > psout.txt #輸出ps內容到psout.txt 2 Sort psout.txt > psout.out #對psout.txt內容進行排序 輸出到psout.out中
管道寫法
1 Ps | sort | pssort.out #將ps內容排序後輸出
自動搜索文件夾下 所有文件中包含的 某字元串
More $(grep -l POSIX *) #在當前文件夾下的文件中 搜索POSIX字元串 列印出包含字元串的文件名
創建腳本
1.在腳本第一行添加 #!/bin/sh
2.把腳本設置為可執行 chmod +x 腳本文件名
3.設定腳本的許可權
shell語法
1.變數 不需要提前申明,變數被用到時會自動創建,所有變數被看做字元串來存儲 獲取變數內容用$字元,
若字元串里包含空格,則需要使用括弧將字元串括起來,此外,等號兩邊不能有空格
$() 或 $"" 用變數的值替換此處的內容 註意 $''不發生替換
2.環境變數&參數變數
$0 當前腳本的文件名
$n 傳遞給腳本的參數n,比如$1表示第一個參數
$# 傳遞給腳本或函數的參數個數。
$*,$@ 傳遞給腳本或函數的所有參數
$? 上個命令的退出狀態,或函數的返回值。
$$ 當前Shell腳本所在的進程ID
$HOME 當前用戶家目錄
$PS1 給出當前用戶名、機器名和當前目錄名
$* 在一個變數中列出所有參數 參數間用IFS中第一個字元分隔開
$@ $*的變體 列出所有參數 與IFS無關 參數之間用空格分開
3.條件
test & [ 命令:shell布爾判斷命令
檢查一個文件是否存在
1 if test -f fred.c 2 then 3 … 4 fi 5 #或者 6 if [ -f fred.c ] 7 then 8 … 9 Fi
4.控制結構
條件判斷
1 if condition 2 then 3 statements 4 else if condition; then 5 statements 6 else 7 statements 8 fi
迴圈語句
1 for variable in values 2 do 3 statements 4 5 done 6 exit 0 7 8 9 while condition; do 10 statements 11 12 done 13 14 15 until condition 16 do 17 statements 18 19 done 20 21 #until與while的條件測試相反 22 23 case variable in 24 pattern [ | pattern] …) statements;; 25 pattern [ | pattern] …) statements;; 26 … 27 esac
命令列表
-
AND列表
執行一系列命令,只有在前邊所有命令都執行成功的情況下才執行後一條命令
statement1 && statement2 && statement3 && …
&&的作用是檢查上一條語句的返回值
AND列表是一系列命令作為一個整體,所有命令都執行,AND才算執行成功
-
OR列表
執行一系列命令直到一條命令成功為止
函數
function_name (){
statements
}
函數定義需要放到調用之前
當一個函數被調用時,腳本程式的位置參數($*/$@/$#/$1/$2等)都會被替換為函數的參數,當函數執行完,這些參數將會恢復他們之前的值