#!/bin/bash
echo "Hello World !"
要點:
- '#!' 是約定標記寫法, 告訴系統(tǒng)用什么shell來運行
- 如果是用解釋器啟動,那么‘#!’無效
變量
# 定義變量, 指向jdk8
JAVA_HOME=/usr/local/jdk8
# 引用變量要加$
echo $JAVA_HOME
# 同上,但是花括號起到識別邊界的作用
echo ${JAVA_HOME}
echo $JAVA_HOMEMM # 為空,JAVA_HOMEMM不存在
# 再次賦值變量前面不要加$
JAVA_HOME=/usr/local/jdk7
# *變量設置為只讀*
readonly JAVA_HOME
JAVA_HOME=/usr/local/jdk8 # 報錯, read-only variable
# *刪除變量,跟變量名, 不需要加$*
unset JAVA_HOME # '_' ! 報錯, read-only variable
test=123
unset test
要點:
- 命名規(guī)范,和其他編程語言類似,也要避免關鍵字
- “=”兩邊不能有空格
- 再次賦值變量前面不要加$
- 引用變量要加$
字符串
單引號
# 1. 單引號,純字符串
str='this is a string'
echo $str
#this is a string
# 2. 單引號必須結對出現(xiàn),多對表示字符串連接
str='this is a string'', blala'
echo $str
#this is a string, blala
# 3. 強調:變量無效, 因為是純字符串
str='java home is $JAVA_HOME'
echo $str
#java home is $JAVA_HOME
雙引號
# 1. 雙引號里可以用變量
str="java home is $JAVA_HOME"
echo $str
# -> java home is /Library/Java/JavaVirtualMachines/jdk1.8.0_77.jdk/Contents/Home
# 2. 可以用轉義的雙引號
str="java home is \"$JAVA_HOME\""
echo $str
# -> java home is "/Library/Java/JavaVirtualMachines/jdk1.8.0_77.jdk/Contents/Home"
拼接
# Forget JAVA_HOME, So boring!
theGirl="Monica"
# 1. 雙引號對 變量 雙引號對
str="I like "$theGirl"^_^"
echo $str
# -> I like Monica^_^
# 2. 雙引號對包好變量
str="I like ${theGirl}."
echo $str
# -> I like Monica.
# 3. 單引號對 變量 單引號對
str='I like '${theGirl}'.'
echo $str
# -> I like Monica.
截取
str=${str%'Script'}
str="I know javaScript"
# 1. 從右邊往左邊截取
str=${str%'Script'}
echo $str
# -> I know java
# 2. SubString
echo ${str:0:11}
# -> I know java
數組
# 1. 定義數組, 空格隔開
# 等同:arr=('a' 'b 'c' 'd')
arr=(a b c d)
# 2. 獲取元素, 從1開始的
echo ${arr[1]}
# 3. 獲取數組長度
# 或者 echo ${#arr[*]}
echo ${#arr[@]}
傳參
定義腳本
#!/bin/bash
# author: 小學2年級
echo "參數傳遞"
# 1. 具體參數是從1開始, 依次類推, 其中0是當前腳本名稱
echo "param 0: $0"
echo "param 1: $1"
echo "param 2: $2"
運行腳本
sh test.sh a1 bc
輸出
參數傳遞
param 0: ./test.sh
param 1: 1
param 2: 2
運算符
算術運算符
mac 中沒有expr, 取而代之的是 $(())
# 栗子, 其他算術運算符類似 + - * / % == !=
a=3
b=4
echo $(($a*$b))
# -> 12
反引號語法
內的表達式執(zhí)行結果,作為一個命令執(zhí)行
# 報錯, 運算出12并echo,然后把12當成一個命令執(zhí)行
`echo $(($a*$b))`
# 正確用法, 拼接字符串并echo,結果為命令,執(zhí)行cat
`echo cat 'test.sh'`
關系運算符
a=10
b=20
| 運算符 | 說明 | 舉例 |
|---|---|---|
| -eq | 檢測兩個數是否相等,相等返回 true。 | [ $a -eq $b ] 返回 false。 |
| -ne | 檢測兩個數是否不相等,不相等返回 true。 | [ $a -ne $b ] 返回 true。 |
| -gt | 檢測左邊的數是否大于右邊的,如果是,則返回 true。 | [ $a -gt $b ] 返回 false。 |
| -lt | 檢測左邊的數是否小于右邊的,如果是,則返回 true。 | [ $a -lt $b ] 返回 true。 |
| -ge | 檢測左邊的數是否大于等于右邊的,如果是,則返回 true。 | [ $a -ge $b ] 返回 false。 |
| -le | 檢測左邊的數是否小于等于右邊的,如果是,則返回 true。 | [$a -le $b ] 返回 true。 |
邏輯運算
| 運算符 | 說明 | 舉例 |
|---|---|---|
| ! | 非運算,表達式為 true 則返回 false,否則返回 true。 | [ ! false ] 返回 true。 |
| -o | 或運算,有一個表達式為 true 則返回 true。 | [ $a -lt 20 -o $b -gt 100 ] 返回 true。 |
| -a | 與運算,兩個表達式都為 true 才返回 true。 | [ $a -lt 20 -a $b -gt 100 ] 返回 false。 |
流程控制
if else
#!/bin/bash
# author: 小學2年級
a=10
b=20
# if [] 內部空格開頭,空格結尾!
if [ $a -lt $b ]
then
echo "$a is less than $b"
else
echo "$a is not less than $b"
fi
for循環(huán)
#!/bin/bash
# author: 小學2年級
for loop in a b c d e f g
do
echo "the value is : $loop"
done
while
#!/bin/bash
# author: 小學2年級
mutex=5
#while(($mutex>=0))
while [ $mutex -ge 0 ]
do
echo "current mutex is $mutex "
#let "mutex--"
mutex=$(($mutex-1))
done
do until
和while類似,不舉例子了,語法如下
until condition
do
command
done
case
語法
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
栗子
這是一個啟動腳本的雛形
#!/bin/bash
# author: 小學2年級
echo '輸入start|stop|restart|status '
echo '你輸入指令為:'
read aNum
# 1. case一個變量, 注意每種情況的語法,以;;結尾
case $aNum in
start)
echo 'starting server.....'
sleep 1
echo 'server started.'
;;
stop)
echo 'stoping server.....'
sleep 1
echo 'server stoped.'
;;
restart)
echo 'restarting server.....'
sleep 1
echo 'server stoped.'
sleep 1
echo 'server started.'
;;
status)
echo 'server is running, PID is 1234567'
;;
# 2. 不存在的情況,類似其他語言中的default
*)
echo 'useage: xxx.sh start|stop|restart|status'
;;
# 3. 結束符號
esac
函數使用
#!/bin/bash
# author: 小學2年級
# 1. 無返回值
function sayHello(){
echo "hello lady."
}
# 1.1 invoke sayHello
sayHello
# 2. 有返回值
function getSth(){
return 12
}
# 2.1 invoke getSth
getSth
echo "getSth is $?"
# 3. 需要傳入參數
function add(){
return $(($1 + $2))
}
# 3.1
add 1 2
echo "add 1 2 is $?"
輸出結果
hello lady.
getSth is 12
add 1 2 is 3
后記
主要是為了能夠快速想起來語法。具體還有很多看上去很奇怪的語法,用到再查吧。
TODO
- 把最近storm的發(fā)布topology的例子放上來
- 字符串常用的操作補充