0402 第十次課:shell基礎(上)

shell基礎上

1、shell介紹

shell是一個命令解釋器,它在操做系統的最外層,負責直接與用戶對話,把用戶的輸入解釋給操做系統,並處理各類各樣的操做系統的輸出結果,輸出到屏幕返回給用戶。這種對話方式能夠是交互的方式(從鍵盤輸入命令,能夠當即獲得shell的迴應),或非交互(腳本)的方式。換句話說,Shell是一個命令行解釋器,它爲用戶提供一個像Linux內核發送請求以便運行程序的界面系統級程序,用戶能夠用Shell來啓動,掛起,中止甚至是編寫一些程序。   Shell仍是一個功能至關請打的編程語言,易編寫,易調試,靈活性較強。Shell是解釋執行的腳本語言,在Shell中能夠直接調用Linux系統命令。html

  • 每一個用戶均可以有本身特定的shellshell

  • CentOS7默認shell爲bash(Bourne Agin Shell)編程

  • 還有zsh、ksh等,這shell默認是不安裝的,使用須要進行安裝centos

  • shell支持特定語法,好比邏輯判斷、循環(if for whell)bash

2、歷史命令

  • 命令歷史查查看編程語言

    使用過的命令歷史存放在用戶家目錄下的.bash_history文件中,能夠經過history命令查看命令使用歷史測試

  • 歷史命令存儲centos7

    1.能夠經過:echo $HISTSIZE 查看多能夠存儲多少條歷史命令,默認爲:1000條。操作系統

    2.history -c 能夠清除歷史命令,可是不能清除.bash_history文件中的歷史命令.net

    3.歷史記錄只有退出終端的時候纔會保存到.bash_history文件中,非正常關閉終端使用過的命令不會保存。

    4.環境變量HISTSIZE的大小能夠在/etc/profile中修改HISTSIZE參數,改完source或者退出終端從新登陸生效

  • 命令歷史格式修改

    一、修改前

    二、臨時修改

    HISTTIMEFORMAT="%Y/%m/%d %H:%M"

    三、永久修改

    /etc/profile中加入:

    HISTTIMEFORMAT="%Y/%m/%d %H:%M "

  • 命令永久保存

    若是想把命令永久保存,不想別人刪除,那能夠把.bash_history文件加上a權限,使文件只能添加不能刪除。

    chattr -a ~/.bash_history

  • 命令歷史快捷鍵

    • !!: 執行最後一次執行的命令

    • !+ 數字: 執行命令歷史中對應數字的命令

    • !+xx: 執行以xx開頭的最後一條命令

3、命令補全

  • centos7中參數補全

    centos6中只能tab進行命令補全,centos7中能夠支持參數補全。

    默然是不支持的須要安裝bash-completion,ctrl+d退出,從新登陸後生效。

    安裝: yum -y install bash-completion

    重啓:reboot

    完成後測試:

  • 命令別名

    若是以爲有些命令比較長和繁瑣,可使用給這些命令起一個別名,起別名的命令:alias

    用法:alias 別名='具體命令'

  • 查看已有的別名

    命令:alias

  • 取消自定義的別名

    命令:unalias 別名

4、通配符

  • "*" :表示0或者多個任意字符

    如:*.txt 列出全部以.txt結尾文件

  • ? : 一個任意字符

    如:?.txt 列出一個任意字符的.txt文件

  • 如:[123].txt 會列出1.txt 2.txt 3.txt

    它也能夠支持字母

    示例:

    列出:1-9

    列出:1-9 和a-z

  • {} :列出花括號裏面開頭

    如:{}.txt: 列出花括號內開頭帶有.txt

    示例:

5、輸出輸入重定向

  • 輸出重定向:

    1.> :左邊輸出重定向到右邊

    如:cat 1.txt > 2.txt 會把1.txt的內容重定向到2.txt中

    2.>>:左邊輸出追加到右邊

    如:at 1.txt >> 2.txt 會把1.txt的內容追加到2.txt中

    3.2> :錯誤重定向

    如:輸入一個錯誤的命令,加上2> 它會把錯誤信息重定向到2.txt中。

    4.2>>: 錯誤追加劇定向

    5.&> 是 > 和 2> 結合 ,會把正確和錯誤信息所有重定向。

  • 輸入重定向

    把右邊的文件輸入到左邊的命令中

    如:把2.txt的內容輸入到wc -l命令中進行統計行數

6、管道符和做業控制

  • 管道符

    就是把前一個命令輸出結果傳到後面的命令

    示例:把cat的輸出結果傳給wc進行統計

  • 做業控制

    做業控制:ctrl + z 能夠暫停一個任務

    好比說正在vi編輯一個文件,能夠ctrl + z暫停vi編輯,這時能夠在控制檯繼續使用其它操做:

    若是想繼續進行vi編輯可使用fg命令從新調用回來繼續執行:

    有多個任務在暫停中,可使用jobs命令查看:

    多個暫停的任務時,指定任務恢復:

    fg id號 ,若是不指定id號那就是恢復最後一次運行的。

  • 暫停任務放到後臺繼續運行:

    以下圖sleep 300 任務是暫停狀態,咱們使用bg 命令把它丟到後臺繼續運行,再查看它的狀態已經變爲運行中

  • 在命令後面加入&也可使命令直接在後臺執行

7、shell變量

  • 列出系統環境變量

    env命令:列出系統預設的所有系統變量

    set命令:set不只能夠顯示系統預設的環境變量,還能夠顯示用戶自定義的變量

  • 自定義變量

  • 自定義變量命名規則

    • a=b,a爲變量名,b爲值,等號兩邊不能有空格。

    • 變量名只能由字母,數字以及下劃線組成,並且不能以數字開頭。

    • 當變量值帶有特殊字符時,須要加上單引號。

    • 變量內容自己就帶有單引號,這個時候須要加上雙引號。

    示例:

    當變量值有特殊符號時須要使用單引號(''):

    變量累加:

  • 全局變量

    當打開多個終端,在其中一個終端中設置一個環境變量,在另一個終端中是查看不到的。

    echo $SHH_TTY:能夠經過此命令查看當前在哪一個終端下。

    終端1:

    終端2:

  • pstree查看當前所在位置

    若是當前shell中運行bash命令,則會進入一個新的shell中,這個shell是原來shell的子shell

    咱們能夠用pstree命令來查看當前所在的位置(若是沒安裝則先安裝:yum install -y psmisc)

  • exprot命令

    以上這種狀況是本地環境變量,只在當前終端下生效,若是想要變爲全局變量則須要使用:exprot命令

    示例:

    另一個終端查看:

    再從新打開一個終端:

  • 取消環境變量

    unset 變量名

8、環境變量配置文件

  • 環境變量配置文件兩個維度

    系統環境變量配置文件分兩個維度:系統層次和用戶層次

  • 系統層

    /etc/profile 用戶登陸的時候會加載到

    /etc/bashrc 用戶或系統執行shell腳本時候,會用調用這個文件裏的一些配置

    通常不要編輯,若是須要全部用戶使用的全局變量則修改/etc/profile

  • 用戶層

    ~/.bashrc

    ~/.bash_profile

    ~/.bash_history 記錄歷史命令

    ~/.bash_logout 用戶退出時作的一些操做,如:想退出時刪除歷史命令,把刪除命令放入這個文件中便可。

  • 是環境變量生效

    source 配置文件

    或者 . 配置文件

  • PS1環境變量

      PS1是來定義系統提示符的系統變量,通常系統默認的形式是:[username@host 工做目錄]$.

    root用戶顯示:

    普通用戶:

    root是以#結尾,普通用戶是$結尾。

    echo $PS1查看:

    修改:

    修改顯示的絕對路徑

    修改顯示顏色

    PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]\$'

  • ps2模式

    查看PS2模式:

9、直播課

  • profile只用用戶登陸纔會生效

  • bashrc用戶不登陸也會生效

  • profile和bashrc的區別

  • echo顯示顏色

  • source命令

    source 命令的另外一種寫法是點符號,用法和 source 相同

    功能:使Shell讀入指定的Shell程序文件並依次執行文件中的全部語句

  • source命令和exec的區別

經過三個腳本測試:

2.sh

#!/bin/bash

echo "children script PID is $$"

echo "now to children script."

export a=2

echo "in children, a=$a"

source.sh

#!/bin/bash
echo "fater script PID is $$"
echo "fater script, set a is 1"
export a=1
echo "it will source ./2.sh"
source ./2.sh
echo "now to father script."
echo "fater script, a is $a"

exec.sh

#!/bin/bash
echo "fater script PID is $$"
echo "fater script, set a is 1"
export a=1
echo "it will exec ./2.sh"
exec ./2.sh
echo "fater script, a is $a"

使用s是不會產生新的pid,souce腳本中的變量跟着進入到父腳本中。會把子腳本中的變量帶出來

exec場景:記錄日誌

相關文章
相關標籤/搜索