1. 程式人生 > 實用技巧 >shell指令碼小計

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 從放棄到入門(2):awk 分隔符

awk 從放棄到入門(3):awk 變數

awk 從放棄到入門(4):awk 格式化

awk 從放棄到入門(5):awk 模式(Pattern)之一

awk 從放棄到入門(6):awk 模式(Pattern)之二

awk 從放棄到入門(7):awk 動作總結之一

awk 從放棄到入門(8):awk 動作總結之二

awk 從放棄到入門(9):awk 陣列詳解

awk 從放棄到入門(10):awk 內建函式



作者:Jason____
連結:https://www.jianshu.com/p/48f2710d8ccd
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。