????看了一遍shell的教程泵肄,感覺云里霧里的,感覺規(guī)則有點(diǎn)奇葩淑翼,可能跟他的語言屬性有關(guān)腐巢,一種命令語言,也是一種程序設(shè)計(jì)語言玄括。在這里是根據(jù)runoob教程進(jìn)行整理冯丙,方便以后自己查看
基本說明:
1、“#!”:約定系統(tǒng)腳本需要什么解釋器來執(zhí)行(就是用哪一種shell)
eg:? ? ?#遭京! /bin/bash? echo "hello world"? ? ?這就是輸出一個(gè)hello world的腳本
2胃惜、運(yùn)行腳本
2種方式,1哪雕、先cd腳本到的腳本在的目錄船殉,執(zhí)行命令
chmod +x ./test.sh #使腳本具有執(zhí)行權(quán)限(test.sh是腳本的名稱)
./test.sh #執(zhí)行腳本
前面要添加“./”,讓他在當(dāng)前目錄尋找腳本文件斯嚎,如果沒有的話利虫,是在Pah目錄里尋找,只有/bin,/sbin,/usr/bin,/usr/sbin在PATH目錄里
一堡僻、空格幾種規(guī)則
(1)糠惫、不能有空格:
1、定義的參數(shù)和等號(hào)之間eg:your_name="echo"
(2)钉疫、必須有空格
1硼讽、所有的運(yùn)算符,中間都要有空格牲阁。eg:val=`expr 2 + 2`? ?$a -eq $b
2固阁、關(guān)系運(yùn)算符要放在"[]"內(nèi)壤躲,"["和"&a"之間有空格...各個(gè)之間都有空格
3、if語句也要有空格
a=10 b=20
if [ $a -eq $b ]
then
echo "a等于b"
else
echo "a不等于b"
fi
二您炉、變量相關(guān)參數(shù)說明
1柒爵、“$”:調(diào)用參數(shù)的時(shí)候使用役电,定義參數(shù)的時(shí)候不使用
your_name=“qinqu”? ? ? ?
echo $your_name
2赚爵、"{}":用來圈定變量的,可加可以不加法瑟,但是為了方便閱讀冀膝,最好加上
eg:echo "I am good at ${skill}Script"? ?如果這里不加的話,會(huì)引起閱讀和解析的混亂
3霎挟、readonly:只讀變量窝剖,不能修改,即使重新賦值之后酥夭,值也不會(huì)變
my_url="www.baidu.com"? ? ?
readonly my_url? ? ? ?
myurl="www.hp.com"
4赐纱、unset:刪除變量,但是不能刪除只讀變量熬北,刪除之后疙描,不會(huì)有任何輸出
my_url="www.baidu.com"? ?
unset my_url? ? ?
echo? $my_url
5、curl:用處最多的應(yīng)該是下載文件 具體參照:curl詳情講解
下面是將一個(gè)地址下載到指定的文件里
curl -o baidu.html http://www.baidu.com
寫法等同于
curl?http://www.baidu.com >> baidu.html
6讶隐、cp:復(fù)制目錄
cp -rf /usr/test.txt? /desktop/receive.txt
注意點(diǎn):1起胰、cp不能復(fù)制目錄,如果要復(fù)制目錄巫延,要添加"-r"? ? ? 2效五、test是要復(fù)制的文件,receive.txt是接受的文件
7炉峰、rm:刪除文件或者目錄
rm -i ../usr/test.txt
-d:刪除硬連接? ? -f:強(qiáng)制刪除文件或者目錄? ? -i:刪除文件前詢問用戶? ?-r:遞歸刪除
8畏妖、source:通常用于重新執(zhí)行剛修改的初始化文件,并立即生效疼阔,而不必注銷或者重新登錄
9戒劫、make:工程編譯命令,實(shí)現(xiàn)工程管理
10竿开、“$#”:表示傳入?yún)?shù)個(gè)數(shù)? ? ? ?“$@”:表示全部傳入?yún)?shù)
end
三谱仪、函數(shù)相關(guān)的參數(shù)說明
1、“$??”:調(diào)用函數(shù)之后的返回值否彩,通過這個(gè)來獲取疯攒。也就是函數(shù)必須寫在前面,才能被調(diào)列荔。
funTest{
......
return $(($a+$b))
}
funTest? ?#調(diào)用
echo "輸入返回的參數(shù)為? $"? ? ?#然后才能調(diào)用他的返回值
2敬尺、函數(shù)參數(shù):在函數(shù)體內(nèi)部枚尼,通過 $n 的形式來獲取參數(shù)的值,eg:$1,$2,但是如果是10或者10以上的數(shù)字的話砂吞,要添加“{}”
“$*”:所有向腳本傳遞的參數(shù)? ? ? “$#”:傳遞到腳本的參數(shù)個(gè)數(shù)
funWithParam()
{ echo "第一個(gè)參數(shù)為 $1 !"
echo "第二個(gè)參數(shù)為 $2 !"
echo "第十個(gè)參數(shù)為 $10 !"
echo "第十個(gè)參數(shù)為 ${10} !"
echo "第十一個(gè)參數(shù)為 ${11} !"
echo "參數(shù)總數(shù)有 $# 個(gè)!"
echo "作為一個(gè)字符串輸出所有參數(shù) $* !" }
funWithParam 1 2 3 4 5 6 7 8 9 34 73
輸出結(jié)果:
第一個(gè)參數(shù)為 1 !
第二個(gè)參數(shù)為 2 !
第十個(gè)參數(shù)為 10 !
第十個(gè)參數(shù)為 34 !
第十一個(gè)參數(shù)為 73 !
參數(shù)總數(shù)有 11 個(gè)!
作為一個(gè)字符串輸出所有參數(shù) 1 2 3 4 5 6 7 8 9 34 73 !
備注:文件也可以添加參數(shù)署恍,規(guī)則和函數(shù)一樣,詳情看下面方法
echo "Shell 傳遞參數(shù)實(shí)例蜻直!";
echo "執(zhí)行的文件名:$0";
echo "第一個(gè)參數(shù)為:$1";
echo "第二個(gè)參數(shù)為:$2";
echo "第三個(gè)參數(shù)為:$3";
設(shè)置權(quán)限盯质,執(zhí)行腳本結(jié)果如下
$ chmod +x test.sh
$ ./test.sh 1 2 3
Shell 傳遞參數(shù)實(shí)例!
執(zhí)行的文件名:./test.sh
第一個(gè)參數(shù)為:1
第二個(gè)參數(shù)為:2
第三個(gè)參數(shù)為:3
四概而、運(yùn)算符的參數(shù)說明
1呼巷、算術(shù)運(yùn)算符,原聲bash不支持?jǐn)?shù)學(xué)運(yùn)算赎瑰,(1)必須要有expr王悍,(2)必須有空格,(3)必須是反引號(hào)餐曼。注意:乘號(hào)需要轉(zhuǎn)義是”\*“压储。
val=`expr 2 + 2`
echo "兩數(shù)之和為 : $val"
val=`expr $a \* $b`
echo "a * b : $val"
2、關(guān)系運(yùn)算符源譬,只支持?jǐn)?shù)字集惋,不支持字符串,eg:"-eq"(相等),"-ne"(不相等)瓶佳,"-gt"(大于),"-lt"(小于)
數(shù)字是否相等芋膘,也可以用 "=="來判斷,同理霸饲,大于小于都可以用">","<"來判斷
a=10
b=20
if [ $a -eq $b ]
#if [ $a == $b ]? “==”也可以去判斷
then
echo "a等于b"
else
echo "a不等于b"
fi
3为朋、字符串運(yùn)算符?
"=":是否相等?
"-z":長度為0,為0返回true??
"str"是否為空厚脉,不為空返回true
? if
[ $a ]
then
echo
"$a : 字符串不為空"
else
echo "$a : 字符串為空"
fi
runoob的關(guān)于運(yùn)算符的解釋习寸,比較詳細(xì)
五、流程控制的說明
1傻工、for循環(huán)的流程
#for循環(huán)遍歷數(shù)組
my_array=(A B "C" D)
for var in my_array
do
echo "for循環(huán)的數(shù)組的元素為 ${my_array[*]}"
done
數(shù)組定義為"()"霞溪,"*":為依次遍歷數(shù)組
循環(huán)為一般格式
for var in item1 item2 ... itemN
do
command1 command2 ... commandN
done
2、while循環(huán)語句
不斷循環(huán)執(zhí)行一系列命令中捆,格式為:
while condition
do?
commond
done
以下是個(gè)基本的while循環(huán):
#! /bin/bash
int=1
while($int < 5)
do
echo $int
let "int++"
done
3鸯匹、case循環(huán)語句
case的語句格式如下:注意一下幾點(diǎn)(1)";;"相當(dāng)于break,(2)每一個(gè)模式以右括號(hào)結(jié)束泄伪,必須為變量和常數(shù)(3)如果沒有匹配值殴蓬,"*"捕獲該值
case 值 in
模式1)
command1 command2 ... commandN ;;
模式2) command1 command2 ... commandN ;;
esac
demo實(shí)例
echo "請輸入1-5之間的數(shù)字"
echo "您輸入的數(shù)字為"
read input
case $input in
1) echo "您選擇了1";;
2) echo "您選擇了2";;
3) echo "您選擇了3";;
4) echo "您選擇了4";;
esac