天天看點

shell程式設計--基本格式,基本文法,運算符,expr,(()),$[]

shell是使用者與核心進行互動操作的一種接口,目前最流行的shell稱為bash shell

shell也是一門程式設計語言<解釋型的程式設計語言>,即shell腳本<就是在用linux的shell指令程式設計>

一個系統可以存在多個shell,可以通過cat /etc/shells指令檢視系統中安裝的shell,不同的shell可能支援的指令文法是不相同的

代碼寫在普通文本檔案中,通常以 .sh為字尾名

vi hello.sh

#!/bin/bash    ## 表示用哪一種shell解析器來解析執行我們的這個腳本程式

echo "hello world"   ##  注釋也可以寫在這裡

## 這是一行注釋

執行腳本

sh hello.sh

或給腳本添加x權限,直接執行

chmod 755 hello.sh

./hello.sh

linux shell中的變量分為“系統變量”和“使用者自定義變量”

可以通過set指令檢視系統變量

系統變量:$home、$pwd、$shell、$user等等

1、文法

變量=值 (例如str=abc)

等号兩側不能有空格

變量名稱一般習慣為大寫

使用變量: $arg

雙引号和單引号有差別,

     雙引号僅将空格脫意,

     單引号會将變量引用比如$param脫意

2、示例

str="hello world"

a=9

echo $a

echo $str

如果想列印 hello worlds isgreater  怎麼辦?

echo $strs is greate 行嗎?

不行,正确寫法是:

echo ${str}s is greate

unset a 撤銷變量 a

readonly b=2 聲明靜态的變量 b=2,不能 unset

export  a   #可把變量提升為目前shell程序中的全局環境變量,可供其他子shell程式使用

注意了解export:

[root@shizhan01 scripts]# vi a.sh

#!/bin/bash

a="a in a.sh"

/root/scripts/b.sh

[root@shizhan01 scripts]# vi b.sh

b="b in b.sh"

echo $b

然後執行  ./a.sh ,會發現 b腳本中并沒有把a腳本中定義的a變量列印出來

如果要在b中列印出a腳本的變量a,需要在a腳本中把變量a做export定義

此時,a變量就成了a.sh腳本所在bash程序的全局變量,該程序的所有子程序都能通路到變量a

另一種方式:

如果在a.sh腳本中用如下方式調用b.sh

.  ./b.sh    ## 注意:重點關注最前面那個 “.”号

或者

source ./b.sh   ##

則,b.sh就在a.sh所在的bash程序空間中運作

總結:

1、a.sh中直接調用b.sh,會讓b.sh在a所在的bash程序的“子程序”空間中執行

2、而子程序空間隻能通路父程序中用export定義的變量

3、一個shell程序無法将自己定義的變量提升到父程序空間中去

4、“.”号執行腳本時,會讓腳本在調用者所在的shell程序空間中執行

3、反引号指派

a=`ls -la`    ## 反引号,運作裡面的指令,并把結果傳回給變量a

a=$(ls -la)   ## 等價于反引号

4、特殊變量

$? 表示上一個指令退出的狀态碼

$$ 表示目前程序編号

$0 表示目前腳本名稱

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

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

$*和$@ 都表示參數清單 

注:$*與$@差別

$* 和 $@ 都表示傳遞給函數或腳本的所有參數

ü  不被雙引号" "包含時——

$* 和 $@ 都以$1  $2  … $n 的形式組成參數清單

ü  當它們被雙引号" "包含時——

"$*" 會将所有的參數作為一個整體,以"$1 $2 … $n"的形式組成一個整串;

"$@" 會将各個參數分開,以"$1" "$2" … "$n" 的形式組成一個參數清單

格式 expr m + n 或$((m+n)) 注意expr運算符間要有空格

例如計算(2+3 )×4 的值

1 .分步計算

         s=`expr 2 + 3`

         expr $s \* 4       ##  *号需要轉義

2.一步完成計算

         expr`expr 2 + 3 ` \* 4

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

((1+2))

(((2+3)*4))

count=1

((count++))

echo $count

但是要想取到運算結果,需要用$引用

a=$((1+2))

a=$[1+2]

繼續閱讀