shell指令碼小計
1.shell指令碼-單引號轉義
新建一個1.sh檔案,內容:
#! /bin/bash #$0表示檔名 echo '$0的含義':$0
輸出:
$0的含義:1.sh
單引號:$0轉義,就是$0
如果是雙引號:
#! /bin/bash echo "$0的含義":$0
輸出: 1.sh的含義:1.sh
雙引號:$0並沒有轉義,依然表示檔名
2.shell指令碼-變數
變數賦值的時候,注意不要有空格
#正確 a="aaaa" #錯誤 a = "aaaa" #變數引用,前面加$ echo $a
3.shell指令碼-獲取輸入
#! /bin/bash echo "enter your name:" read name echo 'your name is :' $name
read 在下一行顯示輸入資訊(輸入joke)
顯示:
enter your name: joke your name is : joke
read -p (- p 是 promote,提示的意思,就是可以讓使用者在提示語相同一行輸入內容)
#! /bin/bash read -p "enter your name:" name echo 'your name is :' $name
顯示:
nter your name:joke
your name is : joke
ead -sp ( 一般在密碼輸入的時候用到,輸入過程看不到輸入的內容)
#! /bin/bash read-sp "enter your password:" pw echo 'your name is :' $pw
顯示: enter your password: #上面這一行提示你輸入,但是看不到輸入的字元 #echo顯示內容 enter your password:your name is : 123
4.shell指令碼-引數
1.變數說明:
$$ ——Shell 本身的 PID(ProcessID) $! ——Shell 最後執行的後臺 Process 的 PID $? —— 最後執行的命令的結束程式碼(返回值) $- —— 使用 Set 命令設定的 Flag 一覽 $* —— 所有引數列表。如 "$*" 用「"」括起來的情況、以"$1 $2 … $n" 的形式輸出所有引數。 $@ —— 所有引數列表。如 "$@" 用「"」括起來的情況、以"$1""$2" … "$n" 的形式輸出所有引數。 $# —— 新增到 Shell 的引數個數 $0 ——Shell 本身的檔名 $1~$n —— 新增到 Shell 的各引數值。$1 是第 1 引數、$2 是第 2 引數…。
2.$@與$* 異同
1)、$@與 $* 沒有雙引號2個同義
但是每個引數都是一個獨立的 "" 引用字串,這就意味著引數被完整地傳遞,並沒有被解釋和擴充套件。這也意味著,每個引數列表中的每個引數都被當成一個獨立的
2)、$@ 和 $* 只在被雙引號包起來的時候才會有差異
"$*" 將所有的引數認為是一個欄位
"$@"以 IFS(預設為空格)來劃分欄位,如果空格在 “” 裡面,不劃分。採用 LS 的指令碼執行./test 1 "2 3" 4 來發現差異
將$@與 $* 作為 陣列, {arg[0]}表示第一個元素,{arg[0]}當 "$*" 有雙引號就表示全部引數,由此看出差異:
#! /bin/bash arg=("$@") echo ${arg[0]} #列印第一個引數 echo $@ echo "==============" arg=("$*") echo '$*'有雙引號: ${arg[0]} echo $* echo "------------下面結果一樣--------------" arg=($@) echo ${arg[0]} echo $@ echo "==============" arg=($*) echo '$*'沒有雙引號: ${arg[0]} echo $*
執行檔案
三個引數 a,b,c
bash 1.sh a b c
顯示: a a b c ============== $*有雙引號: a b c a b c ------------下面結果一樣-------------- a a b c ============== $*沒有雙引號: a a b c
5.shell指令碼-if-then 語句與比較運算子
最重要就是記住括號等運用
參考Linux 之 shell 中的大括號、中括號、小括號的使用詳解 + 多示例
注意:
中括號[] 與字元之間一定要保留一個空格,否則報錯
整數比較符 -eq : (equal to)相等 例如: if [ "$a" -eq "$b" ] -ne : (not equal to)相等 例如: if [ "$a" -ne "$b" ] -gt : (greater than)大於 例如: if [ "$a" -gt "$b" ] -ge : (greater than or equal to)大於或等於 例如: if [ "$a" -ge "$b" ] -lt : (less than)小於 例如: if [ "$a" -lt "$b" ] -le : (less than or equal to)小於或等於 例如: if [ "$a" -le "$b" ] < : 小於 例如: if (( "$a" < "$b" )) <= : 小於等於 例如: if (( "$a" <= "$b" )) > : 大於 例如: if (( "$a" > "$b" )) >= : 大於等於 例如: if (( "$a" >= "$b" )) 字串比較 = : 等於 例如: if [ "$a" = "$b" ] == : 等於 例如: if [ "$a" == "$b" ] != : 不等於 例如: if [ "$a" != "$b" ] < : 小於(ASCII字母順序) 例如: if [[ "$a" < "$b" ]] > : 大於(ASCII字母順序) 例如: if [[ "$a" > "$b" ]] -z : 字元不為空
6.shell指令碼-case
1)、星號 (*) 相當於其他語言中的 default;
2)、雙分號 (;;) 是必須的,相當於 java 中的 break;
3)、豎線 (|) 用於分割多個模式,相當於 or;
echo 'Input a number:' read Num case $Num in 1) echo 'You select 1' ;; 2) echo 'You select 2' ;; 3) echo 'You select 3' ;; 4|5) echo 'You select 4 or 5' ;; *) echo 'default' ;; esac
7.shell指令碼- ( )、`` 與 ${ } 的區別
1)、在 bash 中,$( ) 與 反引號``都是用來作命令替換的。
命令替換與變數替換差不多,都是用來重組命令列的,先完成引號裡的命令列,然後將其結果替換出來,再重組成新的命令列。
$ echo today is $(date "+%Y-%m-%d") today is 2014-07-01
2)、$( ) 與``在操作上,這兩者都是達到相應的效果
但是建議使用 $( ),理由如下:
反引號(``)很容易與單引號('') 搞混亂,尤其對初學者來說。
在多層次的複合替換中,反引號(``)必須要額外的跳脫處理(反斜線),而 $( ) 比較直觀。
最後,$( ) 的弊端是,並不是所有的類 unix 系統都支援這種方式,但反引號是肯定支援的。
# 將cmd1執行結果作為cmd2引數,再將cmd2結果作為cmd3的引數
cmd3 $(cmd2 $(cmd1))
3)、${ } 變數替換
一般情況下,$var 與 ${var} 是沒有區別的,但是用 ${ } 會比較精確的界定變數名稱的範圍
如下:
$ A=B $ echo ${A}B BB 還有之前的引數陣列 arg=($@) echo ${arg[0]}
4)、 $(()) 用法
算術運算和三目運算
#${ } 變數替換 a=c echo ${a}b #$(()) 算術運算與三元運算 echo $((3+2)) echo $((3*6)) echo $((24<3 ? 666 : 555))
8.shell指令碼- 陣列
#! /bin/bash os=('aa' 'bb' 'cc' 'dd') os[4]='ee' # 增加一個元素 #unset os[1] # 刪除陣列第2個元素 echo "${os[@]}" echo "${os[1]}" echo "${!os[@]}" echo "${#os[@]}" # 字串也是陣列(全部字串都在下標為0的元素裡) string=abcdef echo "${string[0]}" #列印全部元素 echo "${string[1]}" #列印為空
執行 1.sh 顯示 ldeepin@ldeepin-PC:~$ bash 1.sh abcdef
9.shell指令碼- while
1)、數值判斷迴圈
#! /bin/bash n=1 while [ $n -le 10 ] do echo "$n" n=$((n+1)) done
自增也可以這樣寫法: #! /bin/bash n=1 while (( $n <= 10 )) do echo "$n" (( n++ )) done
2)、迴圈讀取檔案內容
準備一個test.txt文字,裡面任意新增一些內容,while迴圈讀取每一行內容
#! /bin/bash while read line do echo $line done < test.txt
第二種寫法: #! /bin/bash cat test.txt |while read line do echo $line done
10.shell指令碼- until
#! /bin/bash n=1 sumall=0 until (( $n > 100 )) do sumall=$(( sumall+n )) (( n++ )) done echo $sumall
注意:sumall=$(( sumall+n )) 前面的sumall沒有$
11.shell指令碼- for
1)、100以內的書相加:
#! /bin/bash sumall=0 for (( i=1;i<=100;i++ )) #類似js的語法 do sumall=$(( sumall + i )) done echo $sumall
2)、逐個列印陣列內的元素:
#! /bin/bash os=('aa' 'bb ''cc' 'dd') for (( i=0;i<4;i++ )) do echo ${os[i]} done
12.shell指令碼- if語句判斷檔案
-f :判斷是否是檔案
-d:判斷是否是資料夾
-e:判斷是否存在
-s:判斷檔案是否為空
1)、如下判斷檔案是否存在
#! /bin/bash read -p "enter your filename:" filename if [ -e $filename ] then echo "$filename exists" else echo "$filename isnot exists" fi
2)、如下判斷 檔案 是否為空:
#! /bin/bash read -p "enter your filename:" filename if [ -s $filename ] then echo "$filename is not empty" else echo "$filename is empty" fi
3)、判斷 資料夾 是否為空:採取如下辦法:
#! /bin/bash read -p "enter your filename:" dir file=$(ls $dir) #ls命令獲取輸出文字 if [ -z $file ] then echo "$file is empty" else echo "$file is not empty" fi
4)、詳細的檔案判斷引數
-a file exists. -b file exists and is a block special file. -c file exists and is a character special file. -d file exists and is a directory. -e file exists (just the same as -a). -f file exists and is a regular file. -g file exists and has its setgid(2) bit set. -G file exists and has the same group ID as this process. -k file exists and has its sticky bit set. -L file exists and is a symbolic link. -n string length is not zero. -o Named option is set on. -O file exists and is owned by the user ID of this process. -p file exists and is a first in, first out (FIFO) special file or named pipe. -r file exists and is readable by the current process. -s file exists and has a size greater than zero. -S file exists and is a socket. -t file descriptor number fildes is open and associated with a terminal device. -u file exists and has its setuid(2) bit set. -w file exists and is writable by the current process. -x file exists and is executable by the current process. -z string length is zero.
13.shell指令碼-擴充套件閱讀awk
awk 從放棄到入門(1):awk 基礎 (通俗易懂,快進來看)
awk 從放棄到入門(5):awk 模式(Pattern)之一
awk 從放棄到入門(6):awk 模式(Pattern)之二
作者:Jason____
連結:https://www.jianshu.com/p/48f2710d8ccd
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。