Linux下shell腳本:bash的介紹和使用(詳細)

Shell:一般我們是用圖形界面和命令去控制計算機,真正能夠控制計算機硬件(CPU、內存、顯示器等)的只有操作系統內核(Kernel),由於安全、複雜、繁瑣等原因,用戶不能直接接觸內核,需要另外再開發一個程序,讓用戶直接使用這個程序;該程序的作用就是接收用戶的操作(點擊圖標、輸入命令),並進行簡單的處理,然後再傳遞給內核,內核和用戶之間就多了一層“中間代理”,Shell 其實就是一種腳本語言,也是一個可以用來連接內核和用戶的軟件,我們編寫完源碼後不用編譯,直接運行源碼即可。

常用的Shell:bash由 GNU 組織開發,sh 是 UNIX 上的標準 shell,是第一個流行的 Shell,bash保持了對 sh shell 的兼容性,是各種 Linux 發行版默認配置的 shell。現在sh 已經基本被 bash 代替,bash是sh的擴展補充,但是也有些是不兼容的,大多數情況下區別不大,特殊場景可以使用 bash 代替 sh。

在ubuntu下,上圖是我們打開的終端,這裏輸入的命令就是我們shell的命令,一般$表示的是普通用戶,而#表示的是超級用戶(root)

目錄

1、第一個腳本程序:

2、shell獲取字符串長度:

3、shell變量:

4、引用shell變量:

5、shell變量的賦值、修改、刪除:

5、shell特殊變量:

6、shell中字符串的拼接:

7、字符串的截取

8、shell中的數組:

9、shell中條件判斷if:

10、shell中的 case語句:

11、shell中的 for循環:

12、shell中的 while循環:

13、shell中的 until循環:

14、shell循環中的break和continue:

15、shell中的函數:


1、第一個腳本程序

在終端創建一個.sh文件,vi test.sh

第一行,#!是一個約定的標記,它告訴系統這個腳本需要什麼解釋器來執行,用的是哪種shell,後面的/bin/bash就是指明瞭解釋器的具體位置。 第二行#是註釋行,用來解釋說明,當然#!是特殊的,不在此類。 第三行在是終端輸出 hello,is me!

執行shell腳本:

./test.sh: ./表示當前目錄,執行./test.sh會說明權限不夠,不能執行。需要改變文件的權限:chmod 777 test.sh,就能執行

. ./test.sh: 在不想改變權限的時候,測試腳本是不是能夠正常使用。. 臨時增加權限。

2、shell獲取字符串長度:

#!/bin/bash
#獲取字符串長度
str="123456"
echo "${#str}"

結果:

3、shell變量:

在bash shell中,每一個變量的值都是字符串, 當然也可以用declare 關鍵字顯式定義變量的類型,在賦值的時候等號兩邊不能有空格,如:str=1 ,str='1' ,str="1",變量名必須有字母、下劃線、數字組成,開頭必須字母或者下劃線,不能用shell。

  • 局部變量:shell也有自定義函數,函數裏面的變量爲局部變量,但是它也是相當於全局變量,函數中的變量,在函數外調用也是可以的,如果要僅限函數使用,需要在函數變量前加個關鍵字:local
  • 全局變量:每打開一個終端就是一個shell會話,在這個shell會話(終端)定義的變量就是全局變量,它在這個shell會話有效,當你打開另一個終端就是另一個shell會話,這個變量在另一個終端就失效了。
  • 環境變量:在全局變量前加 export ,如:export a=1  那麼這個變量就是環境變量了。創建這個變量的shell成爲父shell,這個shell中,在創建一個shell叫做子shell,環境變量可以由父shell往下一級一級傳,而不能逆轉往上傳遞。當shell會話銷燬時,這個環境變量也會隨之銷燬。想要永久保存就得環境變量寫到啓動文件中去。

4、引用shell變量

使用shell變量在變量前面加一個$,而標準的是 &{},目的是在一長串字符中可以識別出這個變量,而不會引起誤會,如下:

#!/bin/bash
#引用shell變量
str="abc"

echo "$str"
echo "the str vaile is: $str1" 
#後面增加一個1,就不能正確的識別變量
echo "the str vaile is: ${str}1"
#所以我們引用變量,最好統一用 ${} 的形式

結果:

5、shell變量的賦值、修改、刪除

       a)、shell變量的賦值:          

#!/bin/bash
#變量的賦值
n=1
v1=${n}
v2='${n}'
v3="${n}"

echo "${v1}"
echo "${v2}"
echo "${v3}"

可以從結果看出不加引號和加雙引號的結果是相同的,而單引號是原樣輸出變量後面賦值的內容。

    b、shell變量的修改、刪除:

#!/bin/bash
#變量值的修改
a=1
echo "a: ${a}"
a=2
echo "a: ${a}"

#只讀變量是不可以修改的,在變量前加readonly,就是隻讀變量
c=1
echo "c: ${c}"
readonly c
c=2
echo "c: ${c}"

#只要在變量前面加一個 unset,如: unset a   就可以刪除變量。
unset a
echo "a: ${a}"

5、shell特殊變量:

$0 當前腳本的文件名或者解釋器。
$n(n≥1) 傳遞給腳本或函數的參數。n 是一個數字,表示第幾個參數。例如,第一個參數是 $1,第二個參數是 $2。
$# 傳遞給腳本或函數的參數個數。
$* 傳遞給腳本或函數的所有參數。
$@ 傳遞給腳本或函數的所有參數。當被雙引號" "包含時,$@ 與 $* 稍有不同,$*的所有參數是一個數據,而$@一個參數就是一份數據
$? 上個命令的退出狀態,或函數的返回值
$$ 當前 Shell 進程 ID。對於 Shell 腳本,就是這些腳本所在的進程 ID。

腳本:如果參數個數太多,達到或者超過了 10 個,那麼就得用${n}的形式來接收了,例如 ${10}、${11}

#!/bin/bash
#shell特殊變量
#$n: $0表示本腳本,$1表示輸入的第一個參數:11,$2表示輸入的第一個參數:22    
echo "$ 0: $0"
echo "a: $1"
echo "b: $2"
#$*: 輸入的參數 11 22
echo "$ *: $*"
#$@: 輸入的參數 11 22
echo "$ @: $@"
#$$: shell進程id
echo "$ $: $$"
#$#: 參數個數 2
echo "$ #: $#"

函數:如果參數個數太多,達到或者超過了 10 個,那麼就得用${n}的形式來接收了,例如 ${10}、${11}

#!/bin/bash
#shell特殊變量
#$n: $0表示本腳本,$1表示輸入的第一個參數:11,$2表示輸入的第一個參數:22    
function temp(){
    echo "$ 0: $0"
    echo "a: $1"
    echo "b: $2"
    #$*: 輸入的參數 11 22
    echo "$ *: $*"
    #$@: 輸入的參數 11 22
    echo "$ @: $@"
    #$$: shell進程id
    echo "$ $: $$"
    #$#: 參數個數 2
    echo "$ #: $#"
 }

 temp 11 12

$?:上一個命令的退出狀態,或者返回值:

#!/bin/bash

if [ $1 == 11 ]
then
    return 0
else
    return 1
fi

$?在shell函數中的應用:

#!/bin/bash
function temp(){
    return $1
}
temp 3

#$?: 這裏是函數的返回值
echo "$ ?: $?"

6、shell中字符串的拼接:

#!/bin/bash
#shell字符串的拼接
n1=ab
n2=cd

temp1=${n1}${n2}  #中間不能有空格 
temp2="${n1}${n2}"
temp3="${n1}cdefg"


echo "${temp1}"
echo "${temp2}"
echo "${temp3}"

7、字符串的截取

  • ${string: start :length}:字符串從左邊start開始的位置截取length個字符,如果沒有length,就從左邊start開始到結束
  • ${string: 0-start :length}:字符串從右邊start開始的位置截取length個字符,如果沒有length,就從右邊數start開始到結束
  • ${string#*chars}:字符串從邊開始的第一個chars開始的位置截取到邊結束,chars本身不在截取範圍內
  • ${string##*chars}:字符串從邊開始的最後一個chars開始的位置截取到邊結束,chars本身不在截取範圍內
  • ${string%*chars}:字符串從邊邊開始的第一個chars開始的位置截取到邊結束,chars本身不在截取範圍內
  • ${string%%*chars}:字符串從邊開始的最後一個chars開始的位置截取到邊結束,chars本身不在截取範圍內
#!/bin/bash
#shell截取字符串

str=http//:baidu.com/.c

echo "length: ${str:7:5}"   # baidu
echo "no length: ${str:7}"  # baidu.com/.c

echo "length: ${str:0-7:5}"  # .com/
echo "no length: ${str:0-7}" # .com/.c

echo "#: ${str#*/}"   # /:baidu.com/.c
echo "##: ${str##*/}" # .c

echo "%: ${str%/*}"   # http//:baidu.com
echo "%%: ${str%%/*}" # http

8、shell中的數組:

bash shell 中只支持一維,而不支持二維,定義的形式:array=(n1 n2 n3) ,數組名等號兩邊不能有空格,數組變量的值用空格隔開表示不同的值,一個數組變量的值可以用數字或者字符串不同的形式組成:array=(1 2 ab) 。

Shell 數組的長度不是固定的,定義之後還可以增加元素,如:array[3]=cd ;就在最後增加了一個元素。

也不用逐個賦值;如:array=([2]=ab);但他的長度是1

調用數組:

  • ${array[0]}
  • a=${array[0]}
  • ${array[*]}   //表示數組的所有元素
  • ${array[@]}   //表示數組的所有元素
#!/bin/bash
#shell中的數組
array=( 1 2 ab)

n=${array}  #array中的第一個元素賦值給n

echo "array[0]: ${array[0]}"
echo "array[*]: ${array[*]}"
echo "n[*]: ${n[*]}"

array[5]=cd
echo "array[5]: ${array[5]}"
echo "array[@]: ${array[@]}"



獲取shell數組的元素個數或者shell數組裏字符串的長度:${#array[*]}、${#array[@]}、${#array[4]}

#!/bin/bash
#shell中的數組
array=( 1 2 abc)

echo "#array[*] ${#array[*]}"

array[4]=12345
echo "#array[@] ${#array[*]}" #這邊多加了一個元素就是4
echo "#array[4] ${#array[4]}" #這邊是計算array[4]中字符串的長度

數組的拼接:利用${array[*]}、${array[@]}:

#!/bin/bash
#shell中的數組的拼接
array1=( 1 2 abc)
array2=(cd ef)
array3=(${array1[@]} ${array2[@]})

echo "array3: ${array3[@]}"
echo "array3 length: ${#array3[@]}"

shell數組元素的刪除:unset

#!/bin/bash
#shell中的數組
array1=(1 2 abc)
array2=(1 2 abc)

unset array1[2]  #刪除array1數組中的一個元素abc
echo "array1[*]: ${array1[*]}"


unset array2  #刪除整個數組array2
echo "array2[*]: ${array2[*]}"

9、shell中條件判斷if:

 a)、if單分支:

    -eq 等於,如:if [ "$a" -eq "$b" ]

    -ne 不等於,如:if [ "$a" -ne "$b" ]

    -gt 大於,如:if [ "$a" -gt "$b" ]

    -ge 大於等於,如:if [ "$a" -ge "$b" ]

    -lt 小於,如:if [ "$a" -lt "$b" ]

    -le 小於等於,如:if [ "$a" -le "$b" ]

#!/bin/bash
#shell中if:
#if單分支第一中形式:if []
if [ 1 -eq 1 ] #[]裏面的數據和中括號必須一個空格 
then
        echo "first if:真"
fi

#if單分支第二中形式:if []; then
if [ 1 -eq 1 ]; then #then和if寫在同一行必須要用; 
        echo "second if:真"
fi

#if單分支第三中形式:if (())
if ((1==1))
then
        echo "third if:真"
fi


b、雙分支if:

#!/bin/bash
#shell中if:
#if雙分支
if ((1==0)) #判斷1和o是不是相等
then
        echo "我是真的"
else
        echo "我是假的"
fi

#................................
if [ 1 -eq 0 ] #判斷1和o是不是相等,
then
        echo "我是真的"
else
        echo "我是假的"
fi

3、iif多分支:

#!/bin/bash
#shell中if:
#if多分支
if ((1==0)) #判斷1和o是不是相等
then
        echo "1=0;是真的"
elif ((1>0))
then
        echo "1>0;是真的"
else
        echo "1>0;是假的"
fi

#..............................
if [ 1 -eq 0 ] #判斷1和o是不是相等
then
        echo "1=0;是真的"
elif [ 1 -gt 0 ]
then
        echo "1>0;是真的"
else
        echo "1>0;是假的"
fi

10、shell中的 case語句:

#!/bin/bash
#shell中的case

read VAILE #在屏幕中輸入一個數,1或者2,如果不是這兩個數就代表其他;即 *),
case ${VAILE} in
        "1")
                echo "我是1"
        ;;

        "2")
                echo "我是2"
        ;;

        *)
                echo "我不是1,也不是2"
        ;;
esac

11、shell中的 for循環

a)、for循環形式1:

#!/bin/bash
#shell中的 for
for n in 1 3 5  #n是我們自定義的變量,in後面三個數就是循環3次,每次的值從第一個數的值開始
do
        echo "我是n,我的值是:${n}"
done

b)、for循環形式2:與c語言的形式類似

#!/bin/bash
#shell中的 for
for ((n=0;n<3;n++))
do
        echo "我是n,我的值是:${n}"
done

12、shell中的 while循環:

#!/bin/bash
#shell中的 while
n=0
while [ ${n} -lt 2 ] #n<2;就循環,否則退出循環
do
        n=$((${n}+1))
        echo "我是n,我的值是:${n}"
done
        echo "我退出循環了"

13、shell中的 until循環:

#!/bin/bash
#shell中的 until
n=-2
until ((n>1)) #不滿足條件就循環,滿足條件則退出循環
do
        n=$((${n}+1))
        echo "我是n,我的值是:${n}"
done
        echo "我退出循環了"

14、shell循環中的break和continue

#!/bin/bash
#shell中的 break/continue
n=0
while ((n<6)) #n<6;就循環,否則退出循環
do
        n=$((${n}+1))
        if ((n==2))
        then
                echo "我應該打印2,但我continue了"
                continue
        fi

        if ((n==5))
        then
                echo "n循環6次,應該等於6,但我break了,我現在的值是:${n}"
                break
        fi
        echo "我是n,我的值是:${n}"

done
        echo "我退出循環了"

15、shell中的函數:

function 函數名(){
..........
}

#!/bin/bash
#shell中的函數
function fun(){
        if(($1 > 1)); then
                echo "條件成立"
        fi

        if(($2 > 1)); then
                echo "條件成立"
        else
                echo "條件不成立"
        fi
}

fun 2 1   #這邊傳參數給fun()函數

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章