Shell的作用是将使用者輸入的文本指令轉換成核心能識别的資料指令交給核心進行執行,核心需要翻譯成二進制交由CPU底層來執行
使用者層->Shell->調用對應應用程式->kernel->硬體層->運算和周邊外設->傳遞給kernal->應用程式->shell->使用者
Shell就是底層指令解釋器,Shell就是使用者界面
Shell有兩種文法: Bourne和C
Bourne家族包括:sh、ksh、Bash、psh、zsh
C家族包括:csh、tcsh(主要應用于Unix)
Bash是目前Linux系統的标準shell
echo $SHELL可以檢視到shell對應的位置是:bin/bash
支援的shell在/etc/shells檔案下
可以分級調用進入多個shell
輸出指令:
echo "Hello World"會在指令行傳回指令
echo -e "H e l
l o"
-e指定識别轉義字元, tab鍵
換行
輸出彩色列印:
echo -e "e[1;31m hello world e[0m"
e[1;和e[0m是固定格式,代表開啟顔色和關閉顔色,如果不關閉後續指令行全部是指定顔色,中間部分指定顔色和内容
30m黑色,31m 紅色, 32m 綠色, 33m 黃色,34m藍色,35m洋紅,36m青色,37m白色
第一個shell腳本編寫:
建立腳本:vim hello.sh
輸入:
#!bin/bash
# The first shell program
echo -e "e[1;34m Hello Shell e[0m"
:wq儲存腳本
賦予可執行權限:chmod 755 hello.sh
執行:./hello.sh(常用方法)
或者直接調用:bash hello.sh
shello别名是為了簡化指令執行
alias 檢視目前shell的預設别名,系統預設添加了一些常用必要參數
設定别名,比如:alias ls='ls --color=never'這樣預設就添加了别名的參數,簡化了指令輸入
比如:alias vi='vim'
别名為了友善使用者習慣
alias指令設定的别名,當重新啟動作業系統後設定會失效
不重新開機的情況下取消别名設定:unalias vi='vim'
永久修改,修改對應存放别名的環境變量:vim ~/.bashrc
儲存後立即生效:source ~/.bashrc
指令執行優先級:絕對或者相對路徑執行指令 > 别名 > Bash内部指令 > 環境變量定義的順序查找的第一個指令
shell常用快捷鍵:
強制終止程式 Ctrl+c
清屏 Ctrl+l
删除光标到行首的指令:Ctrl+u
光标定位到行首:Ctrl+a
光标定位到行尾:Ctrl+e
把前台執行的指令放到背景:Ctrl+z
在曆史指令中搜尋:Ctrl+r 按快捷鍵後,輸入指令,根據搜尋結果回車執行
檢視所有的曆史輸入指令:history
清除曆史輸入指令:history -c
曆史指令存放位置:~/.bash_history
檔案中存放的指令比history查詢到的少一些,因為在使用者退出時檔案才會更新
立即同步目前指令到~/.bash_history:history -w
建立不要随便删除曆史指令,便于排錯和檢查入侵
history指令最多儲存1000條,可以編輯/etc/profile修改HISTSIZE的屬性值即可
上下箭頭執行曆史指令
history查詢編号使用!n執行曆史中的編号為n的指令,!!執行上一條指令,!字元串重複執行以該字元串開頭的最後一條指令
TAB鍵執行指令和目錄和檔案補全,補全資料依賴于環境變量和操作路徑
标準輸入:/dev/stdin 檔案描述符:0 裝置:鍵盤
标準輸出:/dev/stdout 檔案描述符:1 裝置:顯示器
标準錯誤輸出:/dev/stderr 檔案描述符:2 裝置:顯示器
其實都是軟連結,連結到實時硬體記憶體目錄/proc
标準輸出重定向:指令 > 檔案 把正确指令輸入覆寫到檔案中,指令 >> 檔案 内容追加
标準錯誤輸出重定向:指令 2> 檔案,指令 2>>檔案 作用同上,注意2後面不要加空格
正确和錯誤同時輸出到檔案:指令 > 檔案 2>&1 或者 指令 >> 檔案 2>&1
或者使用:指令 &> 檔案 和 指令 &>> 檔案
分開檔案寫:指令 >> 檔案1 2>>檔案2 将正确結果放到檔案1,錯誤結果放到檔案2
指令 &>/dev/null 指令不輸出任何一種執行結果,/dev/null相當于Linux下的黑洞,輸出就不存在了
輸入重定向 wc
然後輸入文本按Ctrl+d結束
shell會傳回統計行數,單詞數和字元數
wc -c 隻統計字元數包括空格和換行
wc -w 隻統計單詞數
wc -l 隻統計行數
wc < success.log 或者 wc server.log 統計檔案中的資料
指令 < 檔案 把檔案内容交給指令執行
wc << ddd
輸入文本輸入到ddd後輸入就結束了,傳回統計,ddd就是自定義結束辨別符
多指令順序執行:
指令1 ; 指令2 多個指令順序執行,指令之間沒有任何邏輯關系
指令1 && 指令2 邏輯與當指令1執行正确指令2才會執行
指令1 || 指令2 邏輯或當指令1執行不正确,指令2會執行;當指令1正确執行,指令2不會執行
統計某個操作腳本執行時間:date ; 指令 ; date
data +%s 顯示目前Unix時間戳,便于統計
傳回簡單的正确或者錯誤提示:指令 && echo "yes" || echo "no"
管道符:指令1 | 指令2
指令1的輸出結果作為指令2的操作對象;如果指令1執行錯誤,指令2不會被執行
比如:ls -l /etc/ | more 實作分屏顯示
指令2一定能嚴格操作指令1的輸出,不能随便使用
比如:netstat -an | grep ESTABLISHED | wc -l 處理指令結果中的指定資料,統計一些結果等
通配符:* 比對一個或多個 ? 比對1個 [abc]比對abc中的1個 [a-z] [0-9]比對a-z中的任何一個字母和0-9中的任何一個數字 [^0-9]比對不是數字的的字元
特殊符号:
比如:aa=123 #定義變量
echo $aa 這樣可以輸出變量值
echo '$aa' 輸出就是$aa這個字元串
echo "$aa" 輸出就是$aa的變量值
單引号中''所有特殊符号都原樣輸出 雙引号中,$ ` 都有特殊含義
比如:aa=`ls`是把ls執行結果存放到變量aa中,使用反引号可以執行系統指令
aa=$(ls)和上面作用一緻,建議使用
$單純代表$這個字元,比如:echo $aa就輸出$aa這個字元串,和單引号作用一緻
#代表注釋