linux的bash編程基礎語法

1.SHELL是什麼?

Shell是用戶與內核進行交互操作的一種接口,目前最流行的Shell稱爲bash Shell

Shell也是一門編程語言<解釋型的編程語言>,即shell腳本

一個系統可以存在多個shell,可以通過cat /etc/shells命令查看系統中安裝的shell不同的shell可能支持的命令語法是不相同的

Shell還是一個功能相當強大的編程語言,易編寫、易調試、靈活性強。Shell是解釋執行的腳本語言,所謂腳本語言就是不用編譯就可以直接執行的語言。Shell中可以調用Linux系統命令。

2 shell腳本的執行方式

第一種:輸入腳本的絕對路徑或相對路徑

首先要賦予+x權限

  /root/helloWorld.sh

  ./helloWorld.sh

或者,不用賦予+x權限,而用解釋器解釋執行u+x

sh helloworld.sh

第二種:bash或sh +腳本

  sh /root/helloWorld.sh

  sh helloWorld.sh

第三種:在腳本的路徑前再加". "

  . /root/helloWorld.sh

  . ./helloWorld.sh

區別:第一種和第二種會新開一個bash,不同bash中的變量無法共享

3.1 系統變量

shell中的變量

1)Linux Shell中的變量分爲“系統變量”和“用戶自定義變量”,可以通過set命令查看系統變量。用$輸出變量

2)系統變量:$HOME、

$PWD、

$SHELL、

$USER等等 當前用戶

3)顯示當前shell中所有變量:set

3.2定義變量

1)基本語法:

       變量=   TT=100    輸出變量 echo  $TT

2)變量定義規則

       1)變量名稱可以由字母、數字和下劃線組成,但是不能以數字開頭。

       2)等號兩側不能有空格

       3)變量名稱一般習慣爲大寫

       4)雙引號和單引號有區別,雙引號僅將空格脫意(既字符串之間有空格時要加引號),單引號會將所有特殊字符脫意

       y=bb  echo 'hello $y'----------hello $y 單引號將所有的特殊字符都當做字符串使用,脫意

      echo "hello $y"---------------hello bb 

      字符串之間有空格時,要加引號。

      x=hello word  //報錯,不能有空格,不用引號時。x="hello word",ok

3)案例

STR=“hello world”

A=8               定義變量A

unset A       撤銷變量A

readonly B=2  聲明靜態的變量B=2,不能unset

export變量名  可把變量提升爲全局環境變量,可供其他shell程序使用

這也是環境變量要加export的原因,這樣所有的用戶都可以使用這個變量

export JAVA_HOME=/opt/home/jdk-7.01

export A=1 定義的變量,會對自己(當前用戶)所在的shell進程及其子進程生效

B=1 定義的變量,只對自己的所在的shell進程生效

4.將命令的返回值賦值給變量(特別重要)

     •A=`ls -la` 反引號,運行裏面的命令,並把結果返回給變量A

     •A=$(ls -la) 等價於反引號

           A=`pwd`  & echo $A    ----------/home/hello

           A=$(pwd)  $ echo $A------------/home/hello             

•$? 表示上一個命令退出的狀態

•$$ 表示當前進程編號

•$0 表示當前腳本名稱

•$n 表示n位置的輸入參數(n代表數字,n>=1)

•$# 表示參數的個數,常用於循環

•$*和$@ 都表示參數列表

•$* 和 $@ 都表示傳遞給函數或腳本的所有參數,不被雙引號" "包含時,都以$1 $2 … $n 的形式輸出所有參數

•當它們被雙引號" "包含時,"$*" 會將所有的參數作爲一個整體,以"$1 $2 … $n"的形式輸出所有參數;"$@" 會將各個參數分開,以"$1" "$2" … "$n" 的形式輸出所有參數

5.echo輸出命令

       (1)基本語法:

              echo [選項] [輸出內容]

選項:  echo  -e  支持反斜線控制的字符轉換

控制字符 

       

\\ 

輸出\本身

\a 

輸出警告音

\b 

退格鍵,也就是向左刪除鍵

\c 

取消輸出行末的換行符。和“-n”選項一致

\e 

ESCAPE

\f 

換頁符

\n 

換行符

\r 

回車鍵

\t 

製表符,也就是Tab

\v 

垂直製表符

\0nnn

按照八進制ASCII碼錶輸出字符。其中0爲數字零,nnn是三位八進制數

\xhh

按照十六進制ASCII碼錶輸出字符。其中hh是兩位十六進制數

7. 設置環境變量

1.基本語法:

        export 變量名=變量值         (功能描述:設置環境變量的值)

        echo $變量名                      (功能描述:查詢環境變量的值)

        source配置文件                 (功能描述:讓修改後的配置信息立即生效)

2.位置參數變量

1)基本語法

       $n    (功能描述:n爲數字,$0代表命令本身,$1-$9代表第一到第九個參數,十以上的參數,十以上的參數需要用大括號包含,如${10}

       $*    (功能描述:這個變量代表命令行中所有的參數,$*把所有的參數看成一個整體)

       $@  (功能描述:這個變量也代表命令行中所有的參數,不過$@把每個參數區分對待)

       $#    (功能描述:這個變量代表命令行中所有參數的個數)

2)案例

       1)計算輸入的參數1和參數2的兩個數的和,並輸出到控制檯

#!/bin/bash

num1=$1

num2=$2

sum=$(( $num1 + $num2))

#變量sum的和是num1num2

echo $sum

#打印變量sum的值

       2)打印輸入的參數總數、所有參數

#!/bin/bash

echo "A total of $# parameters"

#使用$#代表所有參數的個數

echo "The parameters is: $*"

#使用$*代表所有的參數

echo "The parameters is: $@"

#使用$@也代表所有參數

       3$*$@的區別

#!/bin/bash

for i in "$*"

#$*中的所有參數看成是一個整體,所以這個for循環只會循環一次

        do

                echo "The parameters is: $i"

        done

x=1

for y in "$@"

#$@中的每個參數都看成是獨立的,所以“$@”中有幾個參數,就會循環幾次

        do

                echo "The parameter$x is: $y"

                x=$(( $x +1 ))

        done

a$*$@都表示傳遞給函數或腳本的所有參數,不被雙引號“”包含時,都以$1 $2 …$n的形式輸出所有參數

b)當它們被雙引號“”包含時,“$*”會將所有的參數作爲一個整體,以“$1 $2 …$n”的形式輸出所有參數;“$@”會將各個參數分開,以“$1” “$2”…”$n”的形式輸出所有參數

注意:腳本可以嵌套。

9預定義變量

1)基本語法:

       $ (功能描述:最後一次執行的命令的返回狀態。如果這個變量的值爲0,證明上一個命令正確執行;如果這個變量的值爲非0(具體是哪個數,由命令自己來決定),則證明上一個命令執行不正確了。)

      $$    (功能描述:當前進程的進程號(PID))

      $!     (功能描述:後臺運行的最後一個進程的進程號(PID))

2)案例

#!/bin/bash

#輸出當前進程的PID,這個PID就是當前這個腳本執行時,生成的進程的PID

echo "The current process is $$"

#使用find命令在root目錄下查找hello.sh文件,符號&的意思是把命令放入後臺執行

find /root -name hello.sh &

 

echo "The last one Daemon process is $!"

echo "$?"

10.1運算符

1)基本語法:

1$((運算式))”或“$[運算式]

2expr m + n

注意expr運算符間要有空格

2)案例:計算(2+3X4的值

       1)採用$[運算式]方式

       [root@hadoop102 datas]# S=$[(2+3)*4]

      [root@hadoop102 datas]# echo $S

       2expr分佈計算

              S=`expr 2 + 3`

              expr $S \* 4

       3expr一步完成計算

              expr `expr 2 + 3` \* 4

              echo `expr \`expr 2 + 3\`\*4`

10.2 條件判斷

 判斷語句

1)基本語法:

[ condition ]注意condition前後要有空格

#非空返回true,可使用$?驗證(0true>1false

2)案例:

[robot]        返回true

[]                   返回false

[condition] && echo OK || echo notok                      條件滿足,執行後面的語句

10.3 常用判斷條件

1)兩個整數之間比較

= 字符串比較

-lt 小於

-le 小於等於

-eq 等於

-gt 大於

-ge 大於等於

-ne 不等於

2)按照文件權限進行判斷

-r 有讀的權限

-w 有寫的權限

-x 有執行的權限

3)按照文件類型進行判斷

-f 文件存在並且是一個常規的文件

-e 文件存在

-d 文件存在並是一個目錄

4)案例

[root@localhost ~]# [ 23 -ge 22 ]
[root@localhost ~]# [ -w student.txt ]
[root@localhost ~]# [ -e /root/install.log ]

10.4.循環控制 
if判斷

1)基本語法:

if [ 條件判斷式 ];then

  程序
fi
或者
if [ 條件判斷式 ]
  then
    程序
fi

       注意事項:(1)[ 條件判斷式 ],中括號和條件判斷式之間必須有空格

2)案例
#!/bin/bash
read –p “please input your name:” NAME
#printf ‘%s\n’ $NAME
if[ $NAME = root ]
then
    echo “hello ${NAME}, welcome !”
elif [ $NAME = robot]
    then
        echo “hello ${NAME}, welcome !”
else
    echo “sorry ”
fi
------------------------------------------------------------------------------
#!/bin/bash
read -p "please input your name:" NAME
#printf'%s\n' $NAME
if [ $NAME = root ]
        then
                echo "hello ${NAME},  welcome !"
        elif [ $NAME = itcast ]
                then
                        echo "hello ${NAME},  welcome !"
       else
                echo "SB, get out here !"
fi


10.6.2 case語句

1)基本語法:

case $變量名 in

  "1"

    如果變量的值等於值1,則執行程序1

    ;;

  "2"

    如果變量的值等於值2,則執行程序2

    ;;

  …省略其他分支…

  *

    如果變量的值都不是以上的值,則執行此程序

    ;;

esac

2)案例

case $1 in

start)

  echo “starting”

  ;; 兩個分號結束

stop)

  echo “stoping”

  ;;

*) *是通用的通配符

  echo “Usage:{start|stop}”

esac

10.6.3 for循環

•第一種:
for N in 1 2 3
do
  echo $N
done
或
for N in 1 2 3; do echo $N; done
或
for N in {1..3}; do echo $N; done

第二種:
for ((i = 0; i <= 5; i++))
do
  echo "welcome $i times"
done
或
for ((i = 0; i <= 5; i++)); do echo "welcome $i times"; done

2)案例:

       1)打印時間

#!/bin/bash

#打印時間

for time in morning noon afternoon evening

        do

                echo "This time is $time!"

        done

3)基本語法2

       for (( 初始值;循環控制條件;變量變化 ))

  do

    程序

  done

4)案例

1)從1加到100

#!/bin/bash

#1加到100

s=0

for (( i=1;i<=100;i=i+1 ))

        do

                s=$(( $s+$i ))

        done

echo "The sum is : $s"

10.6.4 while循環

1)基本語法:

while [ 條件判斷式 ]   條件判斷式都要兩邊加空格

  do

    程序

  done

2)案例

       1)從1加到100

#!/bin/bash

#1加到100

i=1

s=0

while [ $i -le 100 ]

#如果變量i的值小於等於100,則執行循環

        do

                s=$(( $s+$i ))

                i=$(( $i+1 ))

        done

echo "The sum is: $s"

 

第二種

  i=1

  s=0

while ((i<=100))

do

  s=$(($i+$s))

  let i++

done

echo $s10.7 read讀取控制檯輸入

1)基本語法:

       read(選項)(參數)

       選項:

-p:指定讀取值時的提示符;

-t:指定讀取值時等待的時間(秒)。

參數       

       變量:指定讀取值的變量名

2)案例

[robot@hadoop101 etc]$ read -p "please input your name:" NAME

please input your name:lilei

[robot@hadoop101 etc]$ echo $NAME

lilei

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