#!/bin/bash
shell的兩種運行方式
改變權限chmod u+x
運行時指定解釋器
shell變量
變量類型
訪問變量
$、${}
只讀變量
readonly
刪除變量
unset取消變量,但不能取消只讀變量
1 2 3 | myUrl= "http://lingdandan.blog.51cto.com" unset myUrl echo $myUrl |
運行結果:
1 2 3 4 | myUrl=" readonly myUrl unset myUrl echo $myUrl |
運行結果:
shell字符串
字符串可以用單引號,也可以用雙引號,也可以不用引號
單引號
單引號中的字符都會原樣輸出
單引號中間不能有單引號(轉義字符也不行)
雙引號
雙引號裏面可以有變量
單引號可以有轉義字符
字符串拼接
LANGUAGE=English
echo "hello ${LANGUAGE}"
字符串長度計算
echo ${#VAR}
echo ${VAR} | wc -c
echo $TEST_SHELL_VAR | awk '{print length ($0)}'
提取子字符串
#*字符
##*字符
%字符*
%%字符*
VAR代表變量
${VAR:0:10} 表示從左邊第一個字符開始之後的10個字符
${VAR:7} 表示從第七個字符開始之後的所有字符
${VAR:0-3:10} 表示從右邊數的第三個字符開始之後的10個字符
${VAR:0-14} 表示從右邊數的第14個字符開始之後的所有字符
查找字符串
Shell數組
數組定義
bash只支持一維數組,不支持多維
下標從0開始,可以是整數或者表達式
arr=(值1 值2 值3) 圓括號 空格隔開
也可以單獨定義各個分量
數組讀取
${arr[下標]}
使用@可獲得數組的所有元素
獲取數組長度
${#arr[@]}
${#arr[*]}
shell傳參
腳本內獲取參數的格式:$n
$0 $1 $2
$*和$@都是引用所有參數,它們的區別在於$*把參數當作一個字符串,$@把參數當作一個一個的字符串
$* "1 2 3" 只傳了一個參數
$@ "1" "2" "3" 傳來三個參數
shell基本運算
原生的bash不支持簡單的算術運算,可通過別的命令如awk和expr來完成
算數運算
+ - * / % = == !=
VAR=`expr 3 \* 5`
關係運算符
-eq -nq -gt -lt -ge -le
關係運算符只支持數,不支持字符串
字符串運算
= != -z -n str
expr http://lingdandan.blog.51cto.com/10697032/1791485
expr match 字符串 表達式 expr 字符串 : 表達式
expr index 字符串 字符
expr length 字符串
expr substr 字符串 偏移量 長度 (偏移量從1開始)
布爾運算
! -o -a
邏輯運算符
&& ||
文件測試運算符
[ -f file ] -d -b -c -p -r -w -x -s(文件是否大於0) -e(目錄或文件是否存在)
shell echo命令
1、echo "str"
echo str
2、echo "\"str\""
3、echo -e "hello \nworld" #-e開啓轉義 換行
4、echo -e "hello \c" #-e開啓轉義 不換行 抑制輸出結果中的換行字符
echo "world"
5、echo "$var is good!"
6、echo "hello world" >file
7、echo '$var is good!' #原樣輸出字符串不進行轉義,使用單引號
8、echo `date` #顯示命令結果
shell printf
默認printf不會像 echo 自動添加換行符,我們可以手動添加 \n
語法: printf 格式控制字符串 參數列表
shell test命令
數值測試 -eq -ne -ge -le -gt -lt
字符串測試 = != -z -n
文件測試 -d -f -c -b -r -w -x -e -s
shell 流程控制
if
for
for 變量 in 列表
do
done
for var in list1 list2 list3...
do
command
done
或者寫成一行for var in list1 list2;do command1;command2; done;
while
until
case
break
continue
shell函數
[function] func[()]
{
action
[return int;]
}
函數返回值,可以顯示的加return,如果不加將以最後一條命令的結果,作爲返回值,
return後面跟的數爲0-255
下圖爲加return和不加return的區別
return的範圍
函數參數
在函數內部通過$1 $2 $3 ...${10}... 來獲取參數
$# 傳遞到腳本的參數個數
$* 以一個單字符串顯示所有向腳本傳遞的參數
$$ 當前進程的ID
$! 後臺運行的最後一個進程ID
$@ 和$*相同
$- 記錄當前設置的shell選項 himBH是默認值 http://kodango.com/explain-shell-default-options
$? 獲取退出碼
shell輸入輸出重定向
command >file 將輸出重定向到file
command <file 將輸入重定向到file
command >>file將輸出追加到file
n >file 將文件描述符爲n的文件重定向到file
n >>file 將文件描述符爲n的文件追加到file
n >&m 將輸出文件m和n合併
n <&m 將輸入文件m和n合併
<<tag 將開始標記tag和結束標記tag之間的內容作爲輸入
默認情況下command >file將stdout重定向到file
默認情況下command <file將stdin重定向到file
輸出重定向
comand >file
comand <file
comand <input>output
shell文件包含
有test1.sh和test2.sh兩個腳本
內容分別如下:
運行test2.sh的結果如下:(其中test1.sh不需要可執行權限)
由上可見,test2.sh引用了test1.sh的內容,有以下兩種表示方式
. filename
source filename