shell是用戶(hù)和內(nèi)核進(jìn)行交互的一種接口? shell稱(chēng)為bash shell
shell 也是一門(mén)編程語(yǔ)言《解釋型編程語(yǔ)言》? 解釋型語(yǔ)言還有拍黃片——PHP 等(所以PHP是世界上最好的語(yǔ)言)
shell腳本——就是在用Linux的shell命令編程
一個(gè)系統(tǒng)存在多個(gè)shell 可以通過(guò) cat /etc/shells 查看系統(tǒng)中安裝的shell 不同的shell可能支持的命令語(yǔ)法是不相同的
第一個(gè)小實(shí)例:
--------------------------------------
while true
do
echo "i love u"
sleep 0.5
date
done
--------------------------------------
vi hello.sh
#!/bin/bash
echo "hello world"
執(zhí)行腳本 sh hello.sh
--------------------------------------
說(shuō)明:系統(tǒng)執(zhí)行文件首先從環(huán)境變量中找 但是沒(méi)有配置到環(huán)境變量中? 所有執(zhí)行當(dāng)前這個(gè)sh? 要先加./
用./hello.sh? 時(shí)出現(xiàn)權(quán)限不夠? chmod +x hello.sh 將這個(gè)文件添加執(zhí)行權(quán)限就可以了
./需要執(zhí)行權(quán)限
sh不需要姑尺,sh是個(gè)軟鏈接祥得,它可能是一個(gè)任意的shell,通常默認(rèn)是bash shell
用type命令可以查看
./執(zhí)行調(diào)用的是你開(kāi)頭一行定義的shell鲫懒,不指定系統(tǒng)會(huì)調(diào)用默認(rèn)shell程序
--------------------------------------
linux shell 中的變量分為 系統(tǒng)變量和用戶(hù)自定義變量
可以通過(guò)set命令查看
----------------------------------------
自定義變量
語(yǔ)法:
變量=值(注意等號(hào)兩邊不能有空格辜昵,Java中的習(xí)慣還是別帶過(guò)來(lái)的好)
變量名稱(chēng)一般都用大寫(xiě) (約定俗稱(chēng),不然估計(jì)要被前輩說(shuō)道)
使用變量:前面加一個(gè)$
值可以不加單雙引號(hào) 也可以加雙引號(hào) 也可以加單引號(hào)
不加:不能用空格 特殊字符
加雙引號(hào):僅使空格脫意義 ——測(cè)試中發(fā)現(xiàn)\n \t等會(huì)原樣輸出 但是用了$str 就會(huì)輸出這個(gè)變量的值(這里我也不是很清楚筐赔,沒(méi)有具體查證株婴,有讀者知道的話(huà)可以留言或私信告訴我一下)
加單引號(hào):會(huì)將所有的特殊字符脫意
e.g. 要輸出 hello worlds is great
STR="hello world"
echo "${STR}s is great"
unset A 撤銷(xiāo)變量 A
readonly B=2? 聲明靜態(tài)變量 B=2? 不能unset
vi a.sh
#!/bin/bash
A=aaaaa
echo "in a.sh,$a"
sh b.sh
vi b.sh
#!/bin/bash
echo "in b.sh,$a"
sh a.sh
結(jié)果:
in a.sh,aaaaa
in b.sh,
分析:ssh 產(chǎn)生了一個(gè) a.sh的子進(jìn)程 a.sh中又產(chǎn)生了一個(gè)b.sh的子進(jìn)程
a.sh 中定義的變量在ssh 和 b.sh中是沒(méi)有的
解決:#!/bin/bash
export A=aaaaa
echo "in a.sh,$a"
sh b.sh
完美? 變量A就變成了全局變量(不過(guò)只是子進(jìn)程中的全局變量? 在ssh中還是沒(méi)有的 子進(jìn)程空間只能訪問(wèn)父進(jìn)程中用export定義的變量? 一個(gè)shell進(jìn)程無(wú)法將自己定義的變量提升到父進(jìn)程空間中)
不過(guò)還有一種解決辦法? sh b.sh? 換成source /*/*/b.sh? 就可以完美解決不能全局變量的問(wèn)題? source就是將b.sh在a.sh的進(jìn)程空間中執(zhí)行 所以可以引用到變量
還有一個(gè)反引號(hào)的用法(將命令的運(yùn)行結(jié)果賦給一個(gè)變量? 反引號(hào)相當(dāng)于 $()? 可以根據(jù)習(xí)慣自由選擇)
DATE=`date +%Y-%m-%d --date='-1day'`
echo $DATE
輸出前一天的日期
特殊變量:
$? 表示上一個(gè)命令退出時(shí)的狀態(tài)
$$ 表示當(dāng)前進(jìn)程編號(hào)
$0 表示當(dāng)前的腳本名稱(chēng)
$n 表示n位置的輸入?yún)?shù)(n>=1)
$# 表示參數(shù)的個(gè)數(shù) 常用于循環(huán)
$* $@ 都表示參數(shù)列表("$*" 將所有參數(shù)作為一個(gè)整體 "$@"會(huì)將各個(gè)參數(shù)分開(kāi))