15分鐘shell

#!/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的例子放上來
  • 字符串常用的操作補充

連接

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 官網 中文版本 好的網站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,723評論 0 5
  • .bat腳本基本命令語法 目錄 批處理的常見命令(未列舉的命令還比較多,請查閱幫助信息) 1、REM 和 :: 2...
    慶慶慶慶慶閱讀 8,539評論 1 19
  • 一、Python簡介和環(huán)境搭建以及pip的安裝 4課時實驗課主要內容 【Python簡介】: Python 是一個...
    _小老虎_閱讀 6,342評論 0 10
  • 噠 噠 噠 扭頭尋找它 一下一下 看似微不足道的 跳到大理石上 再開心的散開 它所到之處 晶瑩光滑 簡單的 純潔的...
    小白army閱讀 366評論 0 2
  • 母親卑微如青苔 莊嚴如晨曦 柔如江南的水聲 堅如千年的寒玉 舉目時 她是皓皓明月 垂首時 她是莽莽大地 ——《母親...
    舊故麻袋閱讀 613評論 2 7

友情鏈接更多精彩內容