1、回顧基礎命令 2、腳本 3、變數 4、別名 5、條件判斷 6、test判斷 一、回顧基礎命令 shutdown --關機/重啟 exit --退出當前shell rmdir --刪除空目錄 du --查看目錄占用的存儲空間 df --查看已 經掛載的文件系統的空間使用情況 ln --創建鏈接 c ...
1、回顧基礎命令 2、腳本 3、變數 4、別名 5、條件判斷 6、test判斷 一、回顧基礎命令 shutdown --關機/重啟 exit --退出當前shell rmdir --刪除空目錄 du --查看目錄占用的存儲空間 df --查看已 經掛載的文件系統的空間使用情況 ln --創建鏈接 cat --顯示文件的所有內容 head --顯示文件的頭部 tail --顯示文件的尾部 less --分屏/分頁 顯示文件內容 dirname --取出目錄 basename --取出文件名 history --歷史命令 1、ln # ln -s [目標] [源 -- 創建軟鏈接 (symbolic link) # ln [目標] [源] -- 創建硬鏈接 2、cat concatinate,把文件的內容按順序連接起來,輸出到標準輸出。目前,只需要簡單理解成顯示文件的內容即可 # cat f1 -- 顯示文件 f1 的內容到屏幕上 # cat -n f1 -- 顯示文件的內容,並且加上行號 # cat -A f1 -- 列印出一些不可見的字元和位置標記 3、head 讀取文件的頭部 # head -n 3 /etc/passwd --讀取文件前面三行 # head -n -3 /etc/passwd --讀取文件時,丟掉文件的後三行; # head -c 3 /etc/passwd --讀取文件的前面三個位元組 # head -c 10m /dev/zero > f1 --創建一個10M的文件 4、tail 讀取文件的尾部 # tail -n 3 /etc/passwd -- 讀取文件的後面三行 # tail -c 3 /etc/passwd -- 讀取文件的後面三個位元組 # tail -n +28 /etc/passwd -- 讀取文件中從第28行開始直到結尾的所有行 # tail -f /etc/passwd -- 跟蹤文件尾部內容的變化,常用觀察日誌文件的變化 5、history # set -o history --啟用命令歷史功能 ,預設記錄在文件 ~/.bash_history 中 # set +o history --關閉命令歷史功能 # history --顯示最近n條歷史命令 註:以下三個變數用於控制命令歷史的數量,以及是否記錄時間戳 # vim /etc/bashrc --一般配置在該文件當中,用戶級可配置在 ~/.bashrc HISTSIZE=1000000 --最多存儲多少條記錄 HISTFILESIZE=2000000 --命令歷史文件的最大尺寸 HISTTIMEFORMAT='[%Y-%m-%d %H:%M:%S] ' --命令歷史的時間戳格式 export HISTSIZE HISTFILESIZE HISTTIMEFORMAT --把他們定義成環境變數 二、腳本 1、如何執行腳本 # vim test.sh #!/bin/bash echo 'hello world' # bash test.sh # bash -x test.sh --顯示腳本執行過程的信息 # sh test.sh # source test.sh # . test.sh --上述兼為非標準執行腳本,腳本文件可以沒有可執行許可權;下列為標準執行: # head -n 1 test.sh #!/bin/bash # chmod a+x test.sh # ./test.sh 可直接將腳本放到 PATH 路徑下,直接當命令運行 註意:shell 必須以 #! 開頭,讀作sha-bang,這兩個字元用來標識文件類型,#! 用來告訴系統,這個文件里的內容將要用指定的解釋器來解釋,#! 之後的字元串將會被解釋成一個程式,該程式用來解釋當前文件。如果沒有提供sha-bang這一行,當前 shell 將會自主猜測一個,但結果並不保證和預期一致;所以最好明確指定。./test.sh 的運行流程: 1、內核讀取該腳本,檢查文件類型標記,獲取解釋氣得路徑; 2、內核運行解釋器; 3、解釋器運行起來後,就打開腳本文件,解釋其執行 linux 自帶的諸多解釋器:#!/bin/bash;#!/bin/sh;#!/usr/bin/perl;#!/bin/sed;#!/bin/awk 2、四則運算符 + - * / $(()) $[] expr let # echo $((38%5)) --取餘 # echo $[38/5] --求商 # echo $((10**2)) --10的平方 2.1、expr # expr 14 % 9 --取餘 # expr 34 / 9 --求商 # expr 30 \* 3 --使用乘號時,必須用反斜線屏蔽其特定含義 # expr index "sarasara" a --抓取第一個字元數字串出現的位置 # expr substr "this is a test" 3 5 --抓取字串 # expr length "this is a test" --計算字串長度 2.2、let let計算工具用於執行一個或多個表達式,變數計算中不需要加上 $ 來表示變數。如果表達式中包含了空格或其他特殊字元,則必須引起來 # no=20 # let no++ --自增 # let no-- --自減 # let no+=10 --自增10 # let no=no+10 --同上 # let no-=15 --自減15 # let a=5+4 --變了a無須加 $ 符號 # echo $a 3、shell配置文件 /etc/profile --全局配置文件, /etc/bashrc --全局配置文件,一般用來定義環境變了 ~/.bash_profile --用戶配置文件 ~/.bashrc --用戶配置文件 ~/.bash_logout --用戶配置文件,login shell 退出時會讀取該文件 4、shell種類 根據shell 的啟動方式不同,可以大致地把shell分為以下幾種: login shell --在文本界面登錄,如su -;讀取shell配置文件順序如下: /etc/profile——~/.bash_profile——~/.bashrc——/etc/bashrc interactive shell --gnome-terminal 中預設的shell;讀取shell配置文件順序如下: ~/.bashrc —— /etc/bashrc non-interactive shell --用來運行腳本的shell 4.1、在~/.bashrc 中設置一個變數 v,要求該變數只出現在交互shell中 # vim ~/.bash_profile --標識shell 是否登錄shell LOGINSHELL=1 # vim ~/.bashrc --不是登錄shell 時,才設置變數 if [ "$LOGINSHELL" != 1 ];then v="interactive shell only" fi 5、命令優先順序 別名 > 函數 > 內部命令 > 外部命令 6、shell特殊字元 對於shell來說,有些字元除了它本身的意義之外,還有特殊的意義,如果要在字元串中包含特殊字元,就必須通過引用(quoting)的方法來去除特殊字元的特殊意義。以下列出的是部分特殊字元: ~ --不被引用的話將會被shell 替換成家目錄 & --把程式放到後臺執行 $ --dollar 符,可用於參數展開 ${} --變數處理,可對變數的內容做替換,刪除,抽取等操作 * --星號,通配符,匹配所有字元 ? --問號,通配符,匹配任意一個字元 () --命令組 {} --命令組 "" --雙引號,引用符號;可以去除大多數特殊字元的特殊意義,除 $;`;!;\ 外 '' --單引號,引用符號;可以去除所有特殊字元的特殊意義,除自己本身 . --相當於source命令;可用於設置隱藏文件;用於目錄名時,代表當前目錄 / --斜杠,路徑分隔符,根目錄 \ --反斜杠,可用來去除單個字元的特殊意義,也就是所謂的“轉義“,也可用於表示特殊字元,如換行符 (\n) `` --反撇號,命令優先執行,和$()含義是一樣的;如果有嵌套那麼不能用``號 $(())和 $[] --運算符 : --空命令 ; --命令分割;不去考慮上一條命令所執行的結果 ;; --case 選項的結束符 # --註釋 && --邏輯與;可對命令進行分割;但是需要考慮上一條命令所執行的結果 || --邏輯或;可對命令進行分割;不需要考慮上一條命令執行結果 ---------------------------------------------------------------- # echo 'hello world;' "hello world;" hello\ world; --用三種引用符合去除空格的特殊意義 三、變數 1、本地變數 當前用戶自定義的變數;當前進程有效,其他進程或者當前進程的子進程無效 # a=123 # echo $a # unset a --取消變了定義 2、環境變數 當前進程有效,並且能被子進程調用; # env --查看當前系統所有環境變數 # set --查看當前系統所有環境變數和臨時變數 # echo $PATH -- 顯示PATH變數的內容 # export hi=hello --定義環境變數;工作當中一般喜歡把即用的環境變了寫在 ~/.bash_profile 幾個常見環境變數: PATH --影響命令的搜索 PS1 --命令提示符 TMOUT --超時時間,單位為S,時間一到,自動退出 interactive shell ;所以最好將其設為只讀變數 # declare -r TMOUT=60 HISTSIZE, HISTFILESIZE, HISTTIMEFORMAT --命令歷史 3、系統變數 又叫bash中內置的變數;shell本身已經固定好的一些變數 $# --腳本後面接參數個數 $* --腳本後面所有的參數(被雙引號包含則被當成一個字元串輸出) $@ --腳本後面所有的參數(被雙引號包含還是保留各參數的邊界) $? --上一條命令執行後返回的狀態 $$ --當前進程的進程號 $! --後臺運行的最後一個進程號 !$ --最後一條命令或參數 !! --最後一條命令的歷史記錄 $0 --當前程式的程式名或進程 $1~$n --位置參數變數 #!/bin/bash echo "\$0 = $0" echo "\$# = $#" echo "\$* = $*" echo "\$1 = $2" echo "\$7 = $7" echo "\$11 = ${11}" # chmod a+x test.sh # ./test.sh a b c 4、變數定義 a、預設下,變數類型沒啥要求。可以給變數賦任何值,但是等號兩邊不能有任何的空格 b、變數名區分大小寫 c、變數名不能以數字或者特殊符號開頭 d、將命令所執行的結果保存到變數 5、調用變數 # a=$(hostname) # A=123456789 # echo $A # echo ${A:2:3} 6、數組 數組的定義:用小括弧擴起來定義數組,括弧里的元素用空格隔開 # array[0]=var1 # array[1]=var2 # array[2]=var3 # array=(var1 var2 var3) --等同於上述三行,定義數組 # echo ${array[0]} --取數組第一個值 # echo ${array[*]} --取數組所有值 # echo ${array[@]} --同上 7、declare 定義有類型的變數 -i --將變數看成整數 -r --定義只讀變數 -x --將變數導出到環境變數 -a --將變數看成數組 8、read 互動式定義變數 -p --提示信息 -n --字元數 -t --超時 -s --不顯示 四、別名 命令的別名,顧名思義,就是可以通過別的名字來執行命令。通常用於簡化命令的輸入,或者為命令增加一些參數,或者是單純地為命令添加多個訪問名稱。 # alias cp mv rm --查看cp, mv, rm這三個命令是不是別名 # unalias rm -- 刪除別名 rm # alias cdyum='cd /data/yum' -- 簡化輸入 # alias rm='rm -i' -- 為命令增加參數 -- 通常別名是在配置文件~/.bashrc 中設置的 1、驗證別名、函數、內部命令、外部命令的優先順序別 # alias pwd='echo it is an alias' --創建一個 pwd 別名 # function pwd() { echo "this is a function"; } --創建一個 pwd 函數 # pwd --運行pwd,發現輸出是別名 # unalias pwd --刪除別名,再運行 pwd,發現輸出是函數內容 # unset pwd --刪除函數,再運行 pwd,才是輸出當前所在路徑 所以:別名 > 函數 > 內部命令 > 外部命令 五、條件判斷 # vim test ---------------------- if [ 條件 ];then command... fi ---------------------- if [ 條件 ];then command... else command... fi ---------------------- if [ 條件1 ];then command1... elif [ 條件2 ];then command2... else command3... fi ---------------------- if [ 條件1 ];then command1... if [ 條件2 ];then command2... fi else if [ 條件3 ];then command3... elif [ 條件4 ];then command4... else command5... fi fi 六、test判斷 test == [ judge ] 1、文件存在與否的判斷 # vim test.sh #!/bin/bash if test -e $1;then --是否存在;還有 -p;-c;-b;-L if [ -f $1 ];then --使用 [ judge ] 替換 if test -f $1;then --是否存在並且為普通文件 if test -d $1;then --是否存在並且為目錄 if test -S $1;then --是否存在並且套接字文件 echo 'YES' fi # chmod a+x test.sh # ./test.sh [path] 2、文件許可權相關判斷 -r;-w;-x --是否有讀,寫,執行許可權 -u --是否有suid -g --是否有sgid -k --是否有t位 -s --是否為空白文件,-s表示非空;! -s 空文件 3、字元串判斷 = --等於則為真,等於號兩邊必須有空格;也可以是:== != --不相等則為真 -z 字元串 --字元串的長度為零則為真 -n 字元串 --字元串的長度不為零則為真 if test $num1 = $num2;then if [ $num1 = $num2 ];then if [ -n $num1 ];then 4、數值判斷 -eq --等於則為真 -ne --不等於則為真 -gt --大於則為真 -ge --大於等於則為真 -lt --小於則為真 -le --小於等於則為真 if test $[num1] -eq $[num2];then if [ $[num1] -eq $[num2] ];then 5、邏輯判斷 -a 和 && --邏輯與 -o 和 || --邏輯或 ! --非 優先順序:與>或>非 if test -e $1 -o -e $2;then --判斷是否有一個文件存在 if [ -e $1 -o -e $2 ];then --同上 if test ! -e $1 -o ! -e $2;then --判斷兩個文件沒有同時存在 if [ ! -e $1 -o ! -e $2 ];then --同上