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 不加這一行也可以執行,但是要執行其他的複雜命令就需要這一行做標誌。
/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