目錄
- 執(zhí)行行腳本
- 注釋
- 變量
- 字符串
- 數(shù)組
打開文本編輯器拙寡,新建一個文件,擴展名為sh
,創(chuàng)建test.sh
文件执隧,并輸入代碼:
#!/bin/bash
echo "Hello World !"
“#!”
是一個約定的標記,它告訴系統(tǒng)這個腳本需要什么解釋器來執(zhí)行户侥,即使用哪一種Shell
镀琉。echo
命令用于向窗口輸出文本。
1蕊唐、執(zhí)行腳本
方式一: 保存代碼屋摔,并cd到目錄:
chmod +x ./test.sh #使腳本具有執(zhí)行權(quán)限
./test.sh #執(zhí)行腳本
注意,一定要寫成./test.sh替梨,而不是test.sh钓试。運行其它二進制的程序也一樣装黑,直接寫test.sh,linux系統(tǒng)會去PATH里尋找有沒有叫test.sh的弓熏,而只有/bin, /sbin, /usr/bin恋谭,/usr/sbin等在PATH里,你的當前目錄通常不在PATH里挽鞠,所以寫成test.sh是會找不到命令的疚颊,要用./test.sh告訴系統(tǒng)說,就在當前目錄找信认。
方式二: cd到目錄
/bin/sh test.sh
2材义、注釋
以“#”
開頭的行就是注釋,會被解釋器忽略狮杨,sh
里沒有多行注釋母截,只能每一行加一個#
號。只能像這樣:
#!bin/bash
# ----------------------------------------------------------------------
# name: test.sh
# version: 1.0
# createTime: 2017-03-14
# description: shell基礎
# author: birdben
# email: XXXXXXX@163.com
# ----------------------------------------------------------------------
如果非要要用多行注釋可以以下兩種方式:
1橄教、可以把這一段要注釋的代碼用一對花括號括起來清寇,定義成一個函數(shù),沒有地方調(diào)用這個函數(shù)护蝶,這塊代碼就不會執(zhí)行华烟,達到了和注釋一樣的效果
2、如下:
echo "我不是單行注釋"
# echo "我是單行注釋持灰,你看不到我"
echo "我不是多行注釋"
:<<COMMENT
echo "我是多行注釋1盔夜,你看不到我"
echo "我是多行注釋2,你看不到我"
COMMENT
echo "我沒有看到多行注釋1和多行注釋2"
執(zhí)行腳本輸出:
我不是單行注釋
我不是多行注釋
我沒有看到多行注釋1和多行注釋2
可以看到在:<<COMMENT
和COMMENT
之間的腳本代碼沒有執(zhí)行堤魁,其實COMMENT
可以隨意命名喂链,只要別跟中間的注釋內(nèi)容相同即可。當Shell
腳本執(zhí)行遇到:<<COMMENT
妥泉,就不執(zhí)行腳本了椭微,一直到再碰到COMMENT
后才重新開始執(zhí)行腳本。如果忘記寫COMMENT
或者寫錯(由于已經(jīng)不執(zhí)行腳本了,所以即使寫錯也不會報錯),則:<<COMMENT
之后的腳步將都不會執(zhí)行拥坛。
3、變量
定義變量:
定義變量時本慕,變量名不加美元符號($),如:
variableName="value"
注意侧漓,變量名和等號之間不能有空格
變量舉例:
a=100
b="hello world"
echo $a
echo $b
變量名外面的花括號是可選的锅尘,加不加都行,加花括號是為了幫助解釋器識別變量的邊界布蔗,比如下面這種情況:
str="String"
echo "Hi,$strs"
不會輸出Strings
,而是輸出Hi,
鉴象,這是因為Shell
把strs
當成一個變量忙菠,而strs
未被賦值,其值為空纺弊。正確的方法是:
echo “Hi, ${str}s”
變量重新賦值:
已定義的變量牛欢,可以被重新定義,如:
str="String"
echo ${str}
str="hello"
echo ${str}
只讀變量
使用 readonly 命令可以將變量定義為只讀變量淆游,只讀變量的值不能被改變
示例:
str="String"
echo ${str}
readonly str
str="hello"
echo ${str}
輸出:
String
test.sh: line 5: str: readonly variable
刪除變量
使用 unset 命令可以刪除變量
示例:
str="String"
unset str
echo ${str}
上面腳本將不會有任何輸出
shell中特殊變量
變量名只能包含數(shù)字傍睹、字母和下劃線,因為某些包含其他字符的變量有特殊含義犹菱,這樣的變量被稱為特殊變量拾稳。
示例:
echo "執(zhí)行的文件名:$0"
echo "第一個參數(shù)為:$1"
echo "第二個參數(shù)為:$2"
echo "第三個參數(shù)為:$3"
echo "參數(shù)個數(shù):$#"
echo "所有參數(shù):$*"
echo "所有參數(shù):$@"
echo "當前Shell進程的ID:$$"
執(zhí)行腳本:
chmod +x test.sh
./test.sh java oc c++
輸出:
執(zhí)行的文件名:./test.sh
第一個參數(shù)為:java
第二個參數(shù)為:oc
第三個參數(shù)為:c++
參數(shù)個數(shù):3
所有參數(shù):java oc c++
所有參數(shù):java oc c++
當前Shell進程的ID:24348
$*
和 $@
的區(qū)別
$*
和$@
都表示傳遞給函數(shù)或腳本的所有參數(shù),不被雙引號(" ")
包含時腊脱,都以"$1" "$2" … "$n"
的形式輸出所有參數(shù)访得。
但是當它們被雙引號(" ")
包含時,"$*"
會將所有的參數(shù)作為一個整體陕凹,以"$1 $2 … $n"
的形式輸出所有參數(shù)悍抑;"$@"
會將各個參數(shù)分開,以"$1" "$2" … "$n"
的形式輸出所有參數(shù)杜耙。
下面的例子可以清楚的看到 $* 和 $@ 的區(qū)別:
echo "print each param from \$*"
for var in $*
do
echo "$var"
done
echo "print each param from \$@"
for var in $@
do
echo "$var"
done
echo "print each param from \"\$*\""
for var in "$*"
do
echo "$var"
done
echo "print each param from \"\$@\""
for var in "$@"
do
echo "$var"
done
執(zhí)行:
./test.sh a b c
輸出:
print each param from $*
a
b
c
print each param from $@
a
b
c
print each param from "$*"
a b c
print each param from "$@"
a
b
c
4搜骡、字符串
字符串可以用單引號,也可以用雙引號佑女,也可以不用引號
單引號字符串的限制:
1记靡、單引號里的任何字符都會原樣輸出,單引號字符串中的變量是無效的团驱;
2摸吠、單引號字串中不能出現(xiàn)單引號(對單引號使用轉(zhuǎn)義符后也不行)。
雙引號的優(yōu)點:
1嚎花、雙引號里可以有變量
2寸痢、雙引號里可以出現(xiàn)轉(zhuǎn)義字符
示例:
#!/bin/sh
str="hello world"
echo '$str'
echo "$str"
輸出:
$str
czc, hello world
字符串拼接
示例:
#!/bin/sh
str="hello world"
str2="${str}!"
str3=""$str"!"
echo $str2
echo $str3
輸出:
hello world!
hello world!
獲取字符串長度
示例:
#!/bin/sh
str="hello world"
echo ${#str}
輸出結(jié)果11
提取子字符串
#!/bin/sh
str="hello world"
subStr=${str:1:4}
echo $subStr
輸出結(jié)果
ello
判斷是否包含子串
方式一.
#!/bin/sh
strA="hello world"
strB="hello"
result=$(echo $strA | grep "${strB}")
if [[ "$result" != "" ]]
then
echo "包含"
else
echo "不包含"
fi
輸出:包含
先打印長字符串,然后在長字符串中 grep 查找要搜索的字符串贩幻,用變量result記錄結(jié)果
如果結(jié)果不為空,說明strA包含strB两嘴。如果結(jié)果為空丛楚,說明不包含。
這個方法充分利用了grep 的特性憔辫,最為簡潔趣些。
方式二:
#!/bin/sh
strA="hello world"
strB="low"
if [[ $strA =~ $strB ]]
then
echo "包含"
else
echo "不包含"
fi
輸出:不包含
利用字符串運算符 =~ 直接判斷strA是否包含strB
方式三:利用通配符
A="helloworld"
B="low"
if [[ $A == *$B* ]]
then
echo "包含"
else
echo "不包含"
fi
輸出:包含
*代表任意字符,可有可無
5贰您、數(shù)組
bash支持一維數(shù)組(不支持多維數(shù)組)坏平,并且沒有限定數(shù)組的大小
在Shell中拢操,用括號來表示數(shù)組,數(shù)組元素用“空格”符號分割開舶替。定義數(shù)組的一般形式為:
array_name=(value1 ... valuen)
示例:
array=("a" "b" "c")
array2=(
"a"
"b"
"c"
)
還可以單獨定義數(shù)組的各個分量:
array[0]="d"
array[1]="e"
array[2]="f"
可以不使用連續(xù)的下標令境,而且下標的范圍沒有限制
讀取數(shù)組元素值的一般格式是:
${array_name[index]}
示例:
a=${array[0]}
使用@ 或 * 可以獲取數(shù)組中的所有元素
示例:
${array[@]}
${array[*]}
返回數(shù)組所有下標
${!array[@]}
獲取數(shù)組長度的方法與獲取字符串長度的方法相同
# 取得數(shù)組元素的個數(shù)
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得數(shù)組單個元素的長度
lengthn=${#array_name[n]}