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