Bash Shell 基礎特性

孤竹星發表於2015-07-28
Bash Shell 基礎特性之globbing
檔名通配:元字元
    *:匹配任意長度任意字元
            pa*,*pa*,*pa,p*a,*p*a

    ?:匹配任意單個字元
            p?

            pad:p?d,p*d
            pd:p?d, p*d
            paad: p?d, p*d

    []:匹配指定集合內的任意單個字元
            [0-9]:任意數字
            [a-z]:任意小寫字元
            [A-Z]:任意大小字元
            [0-9a-dA-Z]  [[:alnum:]]

    [^]:匹配指定集合外的任意單個字元
            p[^k-z]*

    字符集合:
            [:space:] 所有的空白字元, [[:space:]]
            [:punct:] 所有標點符號
            [:lower:] 所有小寫字母
            [:upper:]     大
            [:digit:] 所有數字
            [:alpha:] 所有字母
            [:alnum:] 所有字母和數字

練習1:顯示/var目錄下所有l開頭,以一個小寫字母結尾,且中間出現一位數字的檔案或目錄;
# ls -d /var/l*[[:digit:]]*[[:lower:]]   
練習2:顯示/etc/目錄下,以任意一位數字開頭,且以非數字結尾的檔案或目錄;
# ls -d /etc/[0-9]*[^0-9]
練習3: 顯示/etc/目錄下,以非字母開頭,後面跟了一個字母及其它任意長度任意字元的檔案或目錄;
# ls -d /etc/[^[:alpha:]][[:alpha:]]*
練習4:複製/etc/下,所有以m開頭,以非數字結尾的檔案或目錄至/tmp/mageedu目錄中;
# mkdir /tmp/mageedu
# cp -a /etc/m*[^0-9] /tmp/mageedu/
練習5:複製/etc目錄下,所有以.d結尾的檔案或目錄至/tmp/mageedu2目錄中;
# mkdir /tmp/mageedu2
# cp -a /etc/*.d /tmp/mageedu2/
練習6:複製/etc目錄下,所有以.conf結尾,以m,n,r,p開頭的檔案或目錄至/tmp/mageedu3目錄中;
# mkdir /tmp/mageedu3
# cp -a /etc/[mnrp]*.conf /tmp/mageedu3


bash特性之快捷鍵:
Ctrl + a: 跳轉至命令首部
Ctrl + e: 跳轉至命令尾部
Ctrl + l: 清屏
Ctrl + c: 中止或取消
Ctrl + u: 刪除命令列首至游標所在處的所有字元
Ctrl + k: 刪除游標所在處至命令尾部的所有字元


bash特性之輸入輸出重定向及管道
程式:有輸入或輸出的需求

標準輸入:keyboard,0
標準輸出:monitor, 1
錯誤輸出:monitor, 2

fd: file descriptor,檔案描述符

輸出重定向:>, >>
>: 目標檔案中原有內容會被清除;
>>: 新內容被追加至目標檔案尾部;

# set -C : 禁止使用覆蓋輸出重定向
此時依然可以使用>|進行強制覆蓋
# set +C

錯誤輸出重定向:2>, 2>>
2>
2>>

合併標準輸出和錯誤輸出的資料流至同一處:&>, &>>
&>
&>>

COMMAND > 檔名 2> &1
COMMAND >> 檔名 2>> &1

輸入重定向:<

tr命令:轉換或刪除字元
tr [OPTION]... SET1 [SET2]
-d: 刪除字元

Here Document:<<
# cat << EOF
# cat > 檔名 << EOF

管道:連線命令,實現將前一個命令的輸出當作後一個命令的輸入
COMMAND1 | COMMAND2 | COMMAND3 ...

練習1:將/etc/passwd檔案的內容的前十行轉換為大寫輸出;
# head /etc/passwd | tr 'a-z' 'A-Z'
練習2:將登入至當前系統上的所有使用者的前兩個的資訊轉換為大寫輸出;
# who | head -2 | tr 'a-z' 'A-Z'

文字檢視及處理工具:
wc [OPTION] FILE...
-c: 位元組數
-l:行數
-w: 單詞數

cut OPTION FILE ...
-d CHAR: 指定欄位分隔符
-f #|#-#|#,#:指定要顯示的欄位

sort [OPTION...] FILE...
-n: 按數值大小進行排序
-r: 逆序
-f: 忽略字元大小寫
-t CHAR: 指定欄位分隔符
-k #: 指定用於排序的欄位
-u: 重複的行只保留一次

uniq [OPTION...] FILE...
-c: 顯示每行出現的次數;
-d: 僅顯示重複的行;
-u: 僅顯示不曾重複的行;

練習:取出ifconfig eth0結果中的ip地址;
# ifconfig eth0 | head -2 | tail -1 | cut -d: -f2 | cut -d' ' -f1

bash指令碼的編寫
命令堆砌

1、指令碼絕對第一行從一個字元位置開始給出shebang:
#!/bin/bash

2、執行指令碼:
(1) 給指令碼執行許可權,而後指定指令碼路徑並執行之;
(2) # bash 指令碼路徑 

練習1:寫一個指令碼
(1) 建立目錄/tmp/testdir; 
(2) 複製檔案/etc/fstab, /etc/rc.d/rc.sysinit至此目錄中;

#!/bin/bash
directory=/tmp/testdir
mkdir $directory
cp /etc/fstab /etc/rc.d/rc.sysinit $directory

引用方式:
強引用:''
弱引用:""
命令引用:`COMMAND`, $(COMMAND)

bash中的算術運算:
+, -, *, /, %

實現算術運算:
(1) let var=算術表示式
  (2) var=$[算術表示式]
  (3) var=$((算術表示式))

  a=6
  a=$[$a+2]

bash中的增強型賦值:
+=, -=, *=, /=, %=

aa+=2   --->   aa=$[$aa+2]
aa-=3   --->   aa=$[$aa-3]

let var++   let aa++  --->   let  aa=$aa+1
let var--   let aa--  --->   let  aa=$aa-1

練習:寫一個指令碼
計算/etc/rc.d/rc.sysinit的行數與/etc/rc.d/init.d/fucntions檔案行數之和;
#!/bin/bash
syslines=`wc -l /etc/rc.d/rc.sysinit |cut -d " " -f 1`
funclines=$(wc -l /etc/rc.d/init.d/functions |cut -d " " -f 1)
lines=$[$syslines+$funclines]
echo $lines

bash程式設計的知識點:位置變數和特殊變數

位置引數變數:
scirpt1.sh arg1 arg2 ...
$0         $1   $2   ...  ${10} ...

指令碼註釋:除第一行的shebang之外,任何以#開頭的行都表示為註釋資訊,會被直譯器忽略;
# information

特殊變數:
$#:位置引數變數的個數, 
$@:位置引數列表 
$*:位置引數列表

練習2:寫一個指令碼,能接受一個引數,此引數為系統上的某文字檔案路徑;
(1) 顯示此檔案的總行數;
#!/bin/bash
filedir=$1
lines=`wc -l $filedir |cut -d ' ' -f 1`
echo "$filedir lines is :$lines"

Linux任務計劃、週期性任務執行

週期性任務執行: cron

守護程式(crond):服務,不間斷地執行於後臺

# service crond {start|stop|status|restart}

cron的任務分兩類:
系統cron任務:定義在/etc/crontab檔案中
使用者cron任務:定義在/var/spool/cron/USERNAME檔案中;功能類似於/etc/crontab檔案

每行定義一個週期性任務計劃

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed

例如:在7點8分執行echo "how are you?"
08 07 * * * root /bin/echo "how are you?"

結果透過郵件進行通知;

時間表示法:
時間:
分鐘:有效取值0-59
小時:有效取值0-23
天:1-31
月:1-12
周幾:0-7

(1) 給出其有效取值範圍內的某特定值;
5 * * * * /bin/echo "howdy"
16 8 * * * /bin/echo "howdy"
16 9 * * 3 /bin/echo "howdy"
12 11 20 * * /bin/echo "howdy"
03 07 01 07 * /bin/echo "howdy"
(2) *:給定時間位上的有效取值範圍內的所有可用值
(3) -: 給定時間位連續取值區間
6-12 * * * * /bin/echo "howdy"
(4) ,: 給定時間位上的離散取值
1,31 * * * * /bin/echo "howdy"
1,31 6,18 * * * /bin/echo "howdy"
(5) */#: 對應時間位每#個時間單位一次;
1 2 */3 * * /bin/echo "howdy"

如何定義使用者cron任務:
crontab命令:
-l: 顯示任務列表
-e:編輯任務
-r: 移除所有任務 

注意:
(1) cron執行時是以cron有自己的執行環境;以cron身份執行命令或指令碼時,建議使用絕對路徑,或在指令碼中明確定義PATH環境變數;
(2) cron的任務結果以郵件通知,如果不想接收郵件,可使用輸出重定向:
> /dev/null
&> /dev/null
> /dev/null 2>&1
(3) 對於cron任務來說,%有特殊用處,如果在命令中需要用到%,得轉義,使用\%格式;如果%放置於單引號中,也可不用轉義
10 03 * * * tar Jcf /backup/etc-$(date +\%F-\%H-\%M-\%S).tar.xz /etc/*

練習
1、每4小時備份一次/etc/目錄至/backup目錄中,儲存的檔案為格式為形如etc-20141124010101.tar.xz;
1 */4 * * * /bin/tar Jcf /backup/etc-$(date +'%Y%m%d%H%M%S').tar.xz /etc/* &> /dev/null

2、每週2,4,7備份/var/log/messages檔案至/backup/messages/目錄中,檔名儲存為形如messages-20141124.tar.xz;
1 1 * * 2,4,7 /bin/tar Jcf /backup/messages/messages-$(date +'%Y%m%d').tar.xz /var/log/messages &> /dev/null

3、工作日的工作時間內,每小時執行一次ip addr show命令;
1 9-18 * * 1-5 /sbin/ip addr show 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28282660/viewspace-1754253/,如需轉載,請註明出處,否則將追究法律責任。

相關文章