1. 程式人生 > >Linux學習-shell(二)

Linux學習-shell(二)

1、什麼是shell? shell是位於作業系統最外一層,為使用者使用作業系統提供介面的軟體,也即是命令直譯器(使用者命令解釋為核心識別的機器語言)。shell分為圖形介面shell(GUI shell 如Windows 圖形介面 win explorer)和命令列shell(CLI shell),不過一般我們說的shell是指CLI shell。shell(CLI shell)一般分為 Bourne shell(包括 sh,ksh, bash)和 C shell(包括 csh and tcsh)。我們常使用的就是Bourne Again shell(bash). shell 指令碼本質上是包含shell命令的檔案! 注意:編寫shell檔案命令時雖然#表示註釋,但是開頭第一行必須是#!/bin/bash 用來告訴作業系統下面是shell 命令,雖然有些命令echo 不加這一行也可以執行,但是要執行其他的複雜命令就需要這一行做標誌。

2、執行shell檔案的方式 >1、使用絕對路徑 或當前路徑 前提是要修改檔案許可權,使其可以被執行u+x

/dirtest/hello.sh
./world.sh

2、bash 檔案 不需要修改檔案許可權即可執行 在當前父shell環境中開啟一個子shell執行,結束關閉子shell。

bash /dirtest/hello.sh

3、source 檔案 不需要修改許可權 在當前父shell環境中執行

source hello.sh

3、別名與快捷方式

別名 alias 檢視系統中的別名命令 比如 alias ll=‘ls -l --color=auto’ 自己修改別名 alias lh=‘ls -alh’ unalias 刪除別名 以上只能暫時修改,重啟將不再生效,因此如果想永久生效應該使用使用者家目錄下bashrc檔案 永久修改 新增行:alias lh=‘ls -alh’

快捷鍵: ctrl+c 強制終止當前命令 ctrl+l 清屏 ctrl+z 後臺執行 ctrl+a 游標移到命令列首 ctrl+e 游標移到命令列尾 ctrl+u 從游標處刪除至行首

4、歷史命令 history 顯示該使用者所有的使用過的命令

[[email protected] ~]# history    
    1  su -root
    2  su -
    3  su 
    4  su root
    ...............
     654  ls -alh
    
[[email protected] ~]# !654   //執行編號為654 的ls -alh 命令
[[email protected] ~]# !!       //執行上一條命令 與上箭頭一樣 不過是多加執行

[[email protected] ~]# !l         //! 字元   自動匹配最近一次相匹配的命令 如 ls -alh

5、重定向 檔案描述符 0 標準輸入 1 標準輸出 2 錯誤輸出

   >以覆蓋的方式把命令結果從輸出至螢幕重定向為輸出至檔案或裝置
   >>以追加的形式把命令結果從輸出至螢幕重定向為輸出至檔案或裝置
[[email protected] ~]# ls -alh >test.log   //覆蓋方式

[[email protected] ~]# ls -alh >> test.log     //追加

這種只是適合正確命令執行結果,而對於錯誤輸出2> 或 2>>並不適合,因而出現應對正確和錯誤輸出的方式

[[email protected] ~]# ls -alh &>test.log   // 覆蓋  正確輸出和錯誤輸出都輸出
[[email protected] ~]# ls -alh &>>test.log  // 追加  正確輸出和錯誤輸出都輸出

正確輸出和錯誤輸出至各自檔案

[[email protected] dirtest]# ld -alh >>f1 2>>f2       //正確結果輸出至f1 錯誤輸出值f2

Linux 黑洞null 相當於window垃圾箱

[[email protected] dirtest]# ls &>/dev/null               //結果不需要顯示在介面 不影響自己使用介面

輸入重定向 (不常用)

wc [選項][檔名]
-c    統計字元數
-w   統計單詞數
-l   統計行數
[[email protected] dirtest]# wc f1
  46  400 2312 f1

[[email protected] dirtest]# wc                        //ctrl+d 執行結果
asd
qwe
we r eww
      3       5      17

6、多命令執行順序 ; 分號 用於分割順序執行的命令,命令按順序執行,且各個命令執行順序不相關,即使某個錯誤,其他執行不影響 && 邏輯與 左邊命令執行成功,則右邊命令執行,否則右邊命令不執行 II 邏輯或 如果左邊命令不能正確執行,則右邊命令執行,否則執行右邊命令

[[email protected] ~]$ date;ls -alh;date     //命令按順序執行,命令開始和結束加上時間 可以顯示命令執行的時間 不過 如果其中命令錯誤 時間也會計在其中

[[email protected] lr]# ls -alh >/dev/null && echo yes     //不看命令執行過程結果 只輸出命令正確執行的個數 即yes 輸出的個數  /dev/null linux中的黑洞 相當於垃圾回收站
[[email protected] lr]# ls -alh >/dev/null && echo yes >/dirtest/dir2.log    //命令執行過程不看 把正確執行的命令 以yes方式輸出到檔案中

ld -alh >/dev/null && echo yes || echo no     //命令正確執行輸出yes 錯誤執行輸出no

7、管道符 命令1 | 命令2 … 命令1的執行結果作為命令2的執行輸入 命令2要可以執行命令1的輸出

[[email protected] lr]# netstat -an |grep  ESTABLISHED |wc -l   // 檢視網路埠狀態 在結果中查詢 ESTABLISHED 已經建立連線的使用者  在統計行數 結果就是使用者連線數

8、萬用字元

?		代表任意一個字元
*       代表任意0個或多個字元
[]		代表括號中的任意一個字元
[-]     代表括號內範圍字元中任意一個
[^]	代表括號內字元取反 不包含字元中一位  	
[[email protected] dirtest]# ls ?F          // 匹配一個任意字元    **ls 加檔名 表示當前目錄下查詢**
FF

[[email protected] /]# find ./dirtest  -name *1*
./dirtest/dir1
./dirtest/dir2/d1.zip
./dirtest/dir2/dir1
./dirtest/practice/file/file1.txt
./dirtest/file1.tar.gz
./dirtest/file1.txt
./dirtest/f1

[[email protected] /]# find ./dirtest/ -name *[0-9].txt
./dirtest/practice/file/file1.txt
./dirtest/file1.txt
./dirtest/file2.txt
[[email protected] /]# find ./dirtest/ -name *[0-9].txt
./dirtest/practice/file/file1.txt
./dirtest/file1.txt
./dirtest/file2.txt
.......

9、bash中的其他其它特殊符號

‘’     	單引號  所有特殊符號都沒有特殊含義,比如$、·      
“”		雙引號  除$(引用變數)、·(反引號 引用命令)、\(轉義字元)外其他特殊符號都沒有特殊含義
·· 		反引號,內部為系統命令,在bash中會先執行它,作用與$()相同,由於容易看錯,因此推薦使用$()
$()	與反引號一樣,用來引用系統命令
#		在shell指令碼中,#開頭代表註釋
$		用於呼叫變數的值 如$name
\		轉義字元,使其失去特殊含義 如\$ 就是字元$沒有引用變數的含義
[[email protected] /]# echo '$value'
$value
[[email protected] /]# echo '555'
555

[[email protected] /]# echo "$value"
666
[[email protected] /]# echo "$value 666"      //空格隔開
666 666
[[email protected] /]# echo $(ls -alh /dirtest)
總用量 96K drwxr-xr-x. 6 root root 4.0K 11月 9 11:18 . dr-xr-xr-x. 19 root root 
....
[[email protected] /]# value=888
[[email protected] /]# echo $value
888
[[email protected] /]# echo "$value"
888
[[email protected] /]# echo "\$value"
$value