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