菜鳥教程之學習Shell script筆記
以下內容是,學習菜鳥shell教程整理的筆記
菜鳥教程之shell教程:http://www.runoob.com/linux/linux-shell.html
Shell簡介
Shell 是一個用 C 語言編寫的程序,它是用戶使用 Linux 的橋梁。Shell 既是一種命令語言,又是一種程序設計語言。
Shell 是指一種應用程序,這個應用程序提供了一個界面,用戶通過這個界面訪問操作系統內核的服務。
Shell腳本(shell script),是一種shell編寫的腳本程序。
業界所說的shell通常是指shell腳本,但是shell和shell script是兩個不同的概念。shell包括shell script和開發shell本身。一般實際生產操作過程中用的是shell編程,編寫特定功能的shell script用來解決實際問題。
Shell環境
Bash:Bourne Again Shell (free and simple to use)
Bash是大多數Linux使用的system默認shell
一般情況下並不區分Bourne Shell 和 Bourne Again Shell,所以像#!/bin/sh 可以改為#!/bin/bash,#! 告訴系統其后路徑指定的程序即是解釋此腳本文件的shell程序。
Shell命令
- $ echo "hello world" #輸出命令
- 運行shell腳本的兩種方法:
./test.sh
/bin/sh test.sh or /bin/php test.php #直接以解釋器運行,就不需要在第一行指定解釋器信息。
Shell變量
- 和C語言的命名規則差不多,需要注意的是,不能使用標點符號,不能使用bash里的關鍵字(可用help命令查看保留的關鍵字)
- 定義使用變量
your_name="xxx"
echo $your_name
echo ${your_name} #變量名后面的花括號用來明確變量的邊界 - 只讀變量
使用readonly命令可以將變量變為只讀變量
readonly xxx - 刪除變量
unset xxx #unset 命令不能刪除只讀變量
Shell字符串
字符串可用用單引號,也可用雙引號,亦可以不用引號
- str='this is a string'
your_name='runoob'
雙引號里面可以有變量,可以出現轉義字符 - 拼接字符串:
your_name="shell"
# 使用雙引號拼接
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, shell ! hello, shell !
hello, shell ! hello, ${your_name} !
- 獲取字符串長度
string="abcd"
echo ${#string} #在字符串前面加#就可以實現
- 提取子字符串
從第2個字符開始截取4個字符
string="shell is great"
echo ${string:1:4} #輸出 hell
- 查找子字符串
用 expr index 實現
查找字符i或a的位置(哪個字母先出現就計算哪個)
string="shell is great"
echo `expr index "$string" io` # 輸出 7 (空格也算字符)
Shell數組
bash支持一維數組(不支持多維數組),並且沒有限定數組的大小。
- 定義數組
數組名={value0 value1 valuue2....} or array_name=(
value0
value1
value2
value3
) #也可以單獨定義:
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
- 讀取數組
一般格式:${數組名[下標]}
vuluen=${array_name[n]}
使用@符號可以讀取數組中所有的元素
echo ${array_name[@]}
- 獲取數組的長度
# 取得數組元素的個數
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得數組單個元素的長度
length=${#array_name[n]}
- Shell注釋
用#號實現單行注釋
用:<<EOF .... EOF 實現多行注釋,EOF 可以換成其它字母 如‘ or !
Shell傳遞參數
#!/bin/bash
echo "Shell 傳遞參數實例!"
echo "執行的文件名:$0";
echo "第一個參數為:$1";
echo "第二個參數為:$2";
echo "第三個參數為:$3";
eg:./test.sh 1 2 3
只會傳遞存在的參數個數,如果輸入的是./test.sh 1 2 3 4 則4不會被輸出
$# $* $@ 的作用及區別
#!/bin/bash
echo "Shell傳遞參數實例!";
echo "第一個參數為:$1";
echo "參數個數為:$#";
echo "傳遞的參數作為一個字符串顯示:$*";
echo "-- \$* 演示 --";
for i in "$*"; do
echo $i
done
echo "-- \$@ 演示 --";
for i in "$@"; do
echo $i
done
執行腳本,輸出結果如下所示:
Shell 傳遞的參數實例!
執行的文件名:./test.sh
第一個參數為:1
第二個參數為:2
第三個參數為:3
參數個數是:3
傳遞的參數作為一個字符串顯示:1 2 3
--$* 演示 --
1 2 3
-- $@ 演示 --
1
2
3
$*與$@區別:只有在雙引號中體現出來。假設在腳本運行時寫了三個參數 1、2、3,,則 " * " 等價於 "1 2 3"(傳遞了一個參數),而 "@" 等價於 "1" "2" "3"(傳遞了三個參數)
- $$ :腳本運行的當前進程ID號
- $- :顯示Shell使用的當前選項,與set命令功能相同
- $? :顯示最后命令退出的狀態 0表示沒有錯誤 其他任何值表明有錯誤
- Linux set命令用於設置shell set指令能設置所使用shell的執行方式,可依照不同的需求來做設置。語法:set [+-abCdefhHklmnpPtuvx] -a 標示已修改的變量,以供輸出至環境變量。
-b 使被中止的后台程序立刻回報執行狀態。
-C 轉向所產生的文件無法覆蓋已存在的文件。
-d Shell預設會用雜湊表記憶使用過的指令,以加速指令的執行。使用-d參數可取消。
-e 若指令傳回值不等於0,則立即退出shell。
-f 取消使用通配符。
-h 自動記錄函數的所在位置。
-H Shell 可利用"!"加<指令編號>的方式來執行history中記錄的指令。
-k 指令所給的參數都會被視為此指令的環境變量。
-l 記錄for循環的變量名稱。
-m 使用監視模式。
-n 只讀取指令,而不實際執行。
-p 啟動優先順序模式。
-P 啟動-P參數后,執行指令時,會以實際的文件或目錄來取代符號連接。
-t 執行完隨后的指令,即退出shell。
-u 當執行時使用到未定義過的變量,則顯示錯誤信息。
-v 顯示shell所讀取的輸入值。
-x 執行指令后,會先顯示該指令及所下的參數。
+<參數> 取消某個set曾啟動的參數。 - 也可以在配置文件里修該Linux shell set
全局配置文件(都在/etc/目錄下,etc為environment config縮寫):
/etc/profile(不推薦修改)——每個用戶在登錄時都會調用
/etc/bashrc(推薦在此處設置全局環境變量,只對bash有效)——每個用戶在bash打開時都會調用
/etc/paths(推薦在此處配置全局環境變量)——寫法為一行一個路徑,其他配置文件中可通過如下形式追加PATH:【export PATH=$PATH:[path1]:[path2]:[path3]……:[pathN] 】
用戶配置文件:(都在~/家目錄下)
~/.bash_profile(推薦在此處配置用戶環境變量,只對bash有效)——當前用戶登錄時調用
~/.bashrc(推薦在此處配置用戶環境變量,只對bash有效)——當前用戶bash打開時調用
Shell數組
- 數組中可以存放多個值。Bash Shell 只支持一維數組(不支持多維數組),初始化時不需要定義數組大小(與 PHP 類似)。
與大部分編程語言類似,數組元素的下標由0開始。
Shell 數組用括號來表示,元素用"空格"符號分割開,語法格式如下:
array_name=(value1 value2)
- 使用下標定義數組
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
- 讀取數組
${array_name[index]}
- 使用@ or *可以獲取數組中的所有元素
#!/bin/bash
my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D
echo "數組的元素為:${my_array[*]}"
echo "數組的元素為:${my_array[@]}"
- 獲取數組的長度
用${#xxx[* or @]}獲取數組的長度
eg:
#!/bin/bash
my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D
echo "數組元素個數為:${#my_array[*]}"
echo "數組元素個數為:${#my_array[@]}"
$ ./test.sh
數組元素個數為:4
數組元素個數為:4