shell學習-常用語句

cnmeimei發表於2020-12-27

為什麼使用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等)都會被替換為函式的引數,當函式執行完,這些引數將會恢復他們之前的值

相關文章