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]