Advanced Bash-Shell Guide(Version 10) 學習筆記一


我喜歡的一句話
the only way to really learn scripting is to write scripts
學習腳本的惟一方法就是寫腳本

更好的命令行參數檢測
    E_WRONGARGS=85 # Non-numerical argument (bad argument format).
    41 #
    42 # case "$1" in
    43 # "" ) lines=50;;
    44 # *[!0-9]*) echo "Usage: `basename $0` lines-to-cleanup";  
    參數中間沒有數字,無效參數
    45 # exit $E_WRONGARGS;;
    46 # * ) lines=$1;;
    47 # esac

更有效的目錄檢測
    3 # cd /var/log || {
    64 # echo "Cannot change to necessary directory." >&2
    65 # exit $E_XCD;
    66 # }

    #!/bin/sh invokes the default shell interpreter, which
    defaults to /bin/bash on a Linux machine.
    #!/bin/bash 叫作sha-bang  magic number

測試調用的參數數量是否正確
    1 E_WRONG_ARGS=85
    2 script_parameters="-a -h -m -z"
    3 # -a = all, -h = help, etc.
    4
    5 if [ $# -ne $Number_of_expected_args ]
    6 then
    7 echo "Usage: `basename $0` $script_parameters"
    8 # `basename $0` is the script's filename.
    9 exit $E_WRONG_ARGS
    10 fi

調用腳本
    bash scriptname

    chmod 555 scriptname (gives everyone read/execute permission) [9]
    or
    chmod +rx scriptname (gives everyone read/execute permission)
    chmod u+rx scriptname (gives only the script owner read/execute permission)

    ./scriptname

    1 #!/bin/rm
    2 # Self-deleting script.
    echo "This line will never print (betcha!)."
    這是一個自殺的腳本
    # Nothing much seems to happen when you run this...
    except that the file disappears.

將文檔改爲#!/bin/more 而且添加可執行權限
結果就是自列表文檔 相似cat XX | more


特殊字符
# 註釋 ,行開頭#註釋,不被執行,取消語法檢測
    在引號和逃逸符裏面不是註釋
        
    6 echo ${PATH#*:} # Parameter substitution, not a comment.
    7 echo $(( 2#101011 )) # Base conversion, not a comment.

; 命令分隔符
    1 echo hello; echo there
;;     case選項分隔符
    1 case "$variable" in
    2 abc) echo "\$variable = abc" ;;

. 至關於source 刷新配置文件,從新加載

   做爲文件名稱的一部分,隱藏文件
    
   至關於當前目錄,..至關於上級目錄

    在正則表達式中匹配單個字符

"    部分引用或弱引用,抑制大部分的特殊字符
'    強引用,抑制全部的特殊字符
,    連接一串算數操做,只返回最後的結果
    1 let "t2 = ((a = 9, 15 / 3))"
    2 # Set "a = 9" and "t2 = 15 / 3"

    連接字符串
    1 for file in /{,usr/}bin/*calc
    2 # ^ Find all executable files ending in "calc"
    3 #+ in /bin and /usr/bin directories.

\    逃逸字符,表達字符字面值的意思
/     文件路徑分隔符
`    輸出命令結果給變量
:    不作任何事,佔位符
    :>將文件長度改成0,而且不改變權限,不在則建立
    : > data.xxx # File "data.xxx" now empty.
    Same effect as cat /dev/null >data.xxx
    也可做爲域分隔符 在/etcpasswd中
    
! 轉換退出狀態或者測試的感受
    change the sense of equal ( = ) to not-equal ( != )
    也可調用命令歷史

*    通配
    在正則中匹配0個或多個字符
    在算數中 單個表示乘號 兩個表示階乘

?    在雙括號中,?做爲三元操做符
    (( var0 = var1<98?9:21 ))
    在通配和正則中表明單個字符

$    變量
    跟變量名錶示變量的值
    在正則中表示一行的結尾
$@    $*  位置參數
$?    退出狀態的變量
$$ 表示當前腳本的進程ID
()    命令組,括號中的命令是子shell,對外面不可見
    數組初始化
        1 Array=(element1 element2 element3)
{}    命令擴展
    8 cp file22.{txt,backup}
    9 # Copies "file22.txt" to "file22.backup"
    ----
    echo {file1,file2}\ :{\ A," B",' C'}
    file1 : A file1 : B file1 : C file2 : A file2 : B
    file2 : C
    ----
    echo {a..z} # a b c d e f g h i j k l m n o p q r s t u v w x y z
    ----
    8 base64_charset=( {A..Z} {a..z} {0..9} + / = )
    9 # Initializing an array, using extended brace expansion.
    表示代碼塊
    對腳本其餘地方可見,非子shell
    1 a=123
    2 { a=321; }
    3 echo "a = $a" # a = 321 (value inside code block)
    也可做爲佔位符
    ls . | xargs -i -t cp ./{} $1
    
[]    表示測試
    數組元素
        1 Array[1]=slot_1
        2 echo ${Array[1]}
    表示字符範圍    
$(())    整數表達式
    1 a=3
    2 b=7
    3
    4 echo $(($a+$b)) # 10
> &> >& >> < <>      重定向操做符
    < > 做爲ASCII碼比較
\<,\>    單詞錨定
|     管道
    Passes the output (stdout) of a previous command to the input (stdin) of the next one
    管道做爲子shell運行,所以不能修改父shell的變量
>|     強制重定向
||    邏輯或
&    後臺運行job
&&    邏輯與
^    行頭部匹配
    
    備份當前目錄最近24小時內修改的文件
    1 #!/bin/bash
    2
    3 # Backs up all files in current directory modified within last 24 hours
    4 #+ in a "tarball" (tarred and gzipped file).
    5
    6 BACKUPFILE=backup-$(date +%m-%d-%Y)
    7 # Embeds date in backup filename.
    8 # Thanks, Joshua Tschida, for the idea.
    9 archive=${1:-$BACKUPFILE}
    10 # If no backup-archive filename specified on command-line,
    11 #+ it will default to "backup-MM-DD-YYYY.tar.gz."
    12
    13 tar cvf - `find . -mtime -1 -type f -print` > $archive.tar
    14 gzip $archive.tar
    15 echo "Directory $PWD backed up in archive file \"$archive.tar.gz\"."
    16
    17
    18 # Stephane Chazelas points out that the above code will fail
    19 #+ if there are too many files found
    20 #+ or if any filenames contain blank characters.
    21
    22 # He suggests the following alternatives:
    23 # -------------------------------------------------------------------
    24 # find . -mtime -1 -type f -print0 | xargs -0 tar rvf "$archive.tar"
    25 # using the GNU version of "find".
    26
    27
    28 # find . -mtime -1 -type f -exec tar rvf "$archive.tar" '{}' \;
    29 # portable to other UNIX flavors, but much slower.
    30 # -------------------------------------------------------------------
    31
    32
    33 exit 0
正則表達式

相關文章
相關標籤/搜索