15分钟shell

#!/bin/bash
echo "Hello World !"

要点:

  • '#!' 是约定标记写法, 告诉系统用什么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


要点:

  • 命名规范,和其他编程语言类似,也要避免关键字
  • “=”两边不能有空格
  • 再次赋值变量前面不要加$
  • 引用变量要加$

字符串

单引号

# 1. 单引号,纯字符串
str='this is a string'
echo $str
#this is a string

# 2. 单引号必须结对出现,多对表示字符串连接
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

反引号语法

内的表达式执行结果,作为一个命令执行

# 报错, 运算出12并echo,然后把12当成一个命令执行
 `echo $(($a*$b))`

# 正确用法, 拼接字符串并echo,结果为命令,执行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循环

#!/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的发布topology的例子放上来
  • 字符串常用的操作补充

连接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,364评论 0 5
  • .bat脚本基本命令语法 目录 批处理的常见命令(未列举的命令还比较多,请查阅帮助信息) 1、REM 和 :: 2...
    庆庆庆庆庆阅读 8,036评论 1 19
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,719评论 0 10
  • 哒 哒 哒 扭头寻找它 一下一下 看似微不足道的 跳到大理石上 再开心的散开 它所到之处 晶莹光滑 简单的 纯洁的...
    小白army阅读 327评论 0 2
  • 母亲卑微如青苔 庄严如晨曦 柔如江南的水声 坚如千年的寒玉 举目时 她是皓皓明月 垂首时 她是莽莽大地 ——《母亲...
    旧故麻袋阅读 554评论 2 7