何爲Shell腳本
第一個shell腳本
#!/bin/bash
echo "hello world"
shell是指一種應用程序,這個應用程序提供了一個界面,用戶可以通過這個界面訪問操作系統內核服務。Ken Thompson的sh是第一種UnixShell,Windows Explorer 是一個典型界面shell。Shell腳本(shell script),一種專門爲shell編寫的腳本程序。業界所說的shell通常是指shell腳本,但是我們因該知道shell和shell腳本是兩個不同的概念。Shell編程和JavaScrit,PHP編程一樣,只要有個能編寫代碼的文本編輯器和一個解析執行的腳本解釋器即可。
Linux的shell種類衆多,常見的有:
Bourne Shell (/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)<易用,免費,大多數Linux系統默認>
C Shell (/usr/bin/csh)
K Shell (/usr/bin/ksh)
Shell for Root(/sbin/sh)
#!
:告訴系統其後路徑所指定的程序即是解釋此腳本文件的Shell程序。
#!/bin/bash
echo "hello World !"
echo 命令用於窗口輸出文本。
運行Shell腳本有兩種方法:
1.作爲可執行程序
將上面的代碼保存爲 test.sh 並cd到相應目錄
chmod +x ./text.sh #使腳本具有執行權限
./text.sh #執行腳本
2.作爲解釋器參數
這種運行方式是,直接運行解釋器,其參數就是shell腳本文件名。
/bin/sh text.sh
/bin/php text.php
這種方式運行腳本,不需要在第一行指定 解釋器信息。
Shell 變量
your_name=“runoob.com”
注意,變量名和等號之間不能有空格。
命名只能使用英文字母,數字和下劃線,首個字符不能以數字開頭。
中間不能有空格,可以使用下劃線(_)
不能使用標點符號。
不能使用bash裏的關鍵字(可用help命令查看關鍵字)
使用一個定義好的變量,只需要在變量名前面加$美元符號即可例如
your_name="name1"
echo $name1
echo ${name1}
變量名外面的花括號是可選的,加不加都可以,加花括號是爲了幫助解釋器識別變量的邊界
已定義的變量可以被重新定義,如:
your_name="aa"
echo ${your_name}
your_name="bb"
echo ${your_name}
只讀變量
使用readonly命令可以將變量定義位只讀變量,只讀變量的值不能被改變。
#!/bin/bash
myUrl="http://www.google.com"
readonly myUrl
myUrl="http://www.runoob.com"
運行腳本的結果如下:
/bin/sh:MAME:This variable is readonly.
your_name:readonly variable
刪除變量
使用unset命令可以刪除變量。
unset variable_name
變量被刪除之後不能再次使用。unset命令不能刪除只讀變量。
實例
#!/bin/bash
myUrl="http://www.google.com"
unset myUrl
echo ${myUrl}
上述例子沒有任何輸出
變量的類型
運行Shell的時候會同時存在三種變量:
1)局部變量 局部變量在腳本或命令中定義,僅在當前shell實例中有效,其他shell啓動的程序不能訪問局部變量
2)環境變量 所有的程序,包括shell啓動的程序,都能訪問環境變量,有些程序還需要環境變量來保證其正常運行,必要的時候shell腳本也可以定義環境變量。
3)shell變量 shell變量是由shell程序設置的特殊變量。shell變量中有一部分是環境變量,一部分是局部變量,這些變量保證shell的正常運行
Shell 字符串
字符串是shell編程中最常用的數據類型(常用的數據類型,數字,字符串)
字符串可以使用雙引號,也可以不用引號。單雙引號的區別跟PHP類似。
單引號
str='this is a string'
單引號的限制:
單引號裏任何字符都會原樣輸出,單引號字符串的變量是無效的;
單引號字符串中不能出現單獨的一個單引號,但是可以成對出現作爲字符串拼接使用。
雙引號
your_name=‘runoob’
str="hello,I konw you are \"$your_name\"! \n" #這裏使用轉義字符 \ 讓"直接輸出
echo -e $str
輸出的結果爲:
hello,I know you are "runoob"!
雙引號的優點:
雙引號裏可以有變量
雙引號裏可以出現轉義字符
拼接字符串
your_name="runoob"
#使用雙引號拼接
greeting="hello,"$your_name" !"
greeting_1="hello,${your_name} !"
echo $greeting $greeting_1
#使用單引號拼接
greeting_2='hello,'$your_name' !'
greeting_3='hello,${your_name} !'
echo $greeting_2 $greeting_3
輸出的結果是:
hello,runoob ! hello,runoob !
hello,runoob ! hello,${your_name} !
獲取字符串長度
string="abcd"
echo ${#string} #輸出4
提取子字符串
以下實例從字符串第二個字符開始截取4個字符:
string="runoob is a great site"
echo ${string:1:4} #輸出unoo
查找子字符串
查找字符i或o的位置(那個字母先出現就計算哪個):
string="runoob is a great site"
echo `expr index "$string" io` #輸出4 檢測的是o的位置
string="irunoob is a great site"
echo `expr index "$string" io` #輸出1 檢測的是i的位置
特別注意查找子字符串中的 ` 是反引號,不是單引號’
Shell數組
bash支持一維數組(不支持多維數組),並沒有限定數組的大小。
類似於C語言,數組元素的下標由0開始編號,獲取數組中的元素要利用下標,下標可以是整數或算術表達式,其值應大於或等於0.
定義數組
在Shell中,用括號來表示數組,數組元素用"空格"符號分割開。定義數組的一般形式:
數組名=(值1 值2 ... 值n)
例如:
array_name=(value0 value1 value2 value3)
或者
array_name=(
value0
value1
value2
value3
)
還可以單獨定義數組的各個分量:
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
可以不使用連續的下標,而且下標的範圍沒有限制。
讀取數組
格式
${數組名[下標]}
例如:
valuen=${array_name[n]}
還可以使用@
符號獲取數組中的所有元素,例如:
echo ${array_name[@]}
獲取數組的長度
獲取數組長度的方法與獲取字符串長度的方法相同,例如:
#取得數組元素的個數
length=${#array_name[@]}
#或者
length=${#array_name[*]}
#取得數組單個元素的長度
lengthn=${#array_name[n]}
shell的註釋
以#
開頭的行就是註釋,會被解釋器忽略。
通過每一行加一個#號設置多行註釋
多行註釋還可以使用以下格式
:<<EOF
註釋內容...
註釋內容...
註釋內容...
EOF
EOF 也可以使用其他符號
多行註釋還可以使用以下格式
:<<'
註釋內容...
註釋內容...
註釋內容...
'
多行註釋還可以使用以下格式
:<<!
註釋內容…
註釋內容…
註釋內容…
!
==========================================================
Shell 傳遞參數
我們可以在執行Shell腳本時,向腳本傳遞參數,腳本內獲取的格式爲 $n。n代表一個數字
1爲執行腳本的第一個參數,2爲執行腳本的第二個參數,以此類推…
實例
以下實例我們向腳本傳遞三個參數,並分別輸出,其中$0爲執行的文件名
#!/bin/bash
echo "shell傳遞參數實例";
echo "執行的文件名: $0";
echo "第一個參數爲: $1";
echo "第二個參數爲: $2";
echo "第三個參數爲: $3";
爲腳本設置可執行權限,並執行腳本。其輸出結果如下所示
$ chmod +x text.sh
$ ./text.sh 1 2 3
shell 傳遞參數實例!
執行的文件名: ./text.sh
第一個參數爲: 1
第一個參數爲: 2
第一個參數爲: 3
$#
傳遞到腳步的參數個數
$*
以一個單字符串顯示所有向腳本傳遞的參數。
如"$*"
用 " 括起來的情況,以"$1 $2 ... $n"
的形式輸出所有參數。
$$
腳本運行的當前進程ID號
$@
與$*
相同但是使用時加引號,並在引號中返回每個參數。
如"$@"
用 "
括起來的情況,以"$1" "$2"..."$n"
的形式輸出所有參數。
$-
顯示Shell使用的當前選項,與set
命令功能相同。
$?
顯示最後命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤。
#!bin/bash
echo "Shell 傳遞參數實例";
echo "第一個參數爲:$1";
echo "參數個數爲:$#";
echo "傳遞的參數作爲一個字符串顯示:$*";
執行腳本,輸出結果如下所示:
$ chmod +x text.sh
$ ./text.sh 1 2 3
Shell 傳遞參數實例!
第一個參數爲1:1
參數個數爲:3
傳遞的參數作爲一個字符串顯示:1 2 3
$*
和$@
的區別
相同點:都是引用所有參數。
不同點:只有在雙引號中體現出來。假設在腳本運行時寫了三個參數1 ,2,3,
,則"*"等價與"1 2 3"
(傳遞一個參數)
,而"@"
等價於"1" "2" "3"
(傳遞三個參數)
#!/bin/bash
echo "-- \$*演示---"
for i in "$*"; do
echo $i
done
echo "-- \$@演示---"
for i in "$@"; do
echo $i
done
執行腳本,輸出結果如下所示:
$ chmod +x test.sh
$ ./test.sh 1 2 3
--$*演示---
1 2 3
--$@演示---
1
2
3
還有後續的等有空再來寫