15分钟shell

2018-08-15  本文已影响0人  小学2年级
#!/bin/bash
echo "Hello World !"

要点:

变量

# 定义变量, 指向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

连接

上一篇下一篇

猜你喜欢

热点阅读