目录
shell基础语法之变量
shell 变量命名
shell 变量调用
shell 变量分类
shell 运算符
运算符种类
关系运算符
布尔运算符
字符串运算符
逻辑运算符
文件测试运算符
shell条件判断&流程控制
单分支if
双分支if
多分支if语句
不论前端还是后端,再学会Linux的基础上,还应该学会写一些简单的Shell。不止是工作,日常中想做一些东西,如果手动做就很累人也费时间,如果你会用Shell脚本处理就很简单了,本文普及的shell的一些基础知识。后面还会持续更新。
shell基础语法之变量
shell 变量命名
- 变量只能由大小写字母,数字和下划线组成。
- 变量名称不能以数字开头。
- 变量可以存储数字类型或者字符串类型。
- 变量赋值等号两边不能有空格。
- 字符串的变量可以用单引号或者双引号括起来。
定义变量:
1 2 | ➜ ~ name= "xiaoka" ➜ ~ age=2 |
无效的定义
[
1 2 3 4 | root@iz2ze0ajic0vbv28hcdctpz hello] # 1212=sfds - bash : 1212=sfds: 未找到命令 [root@iz2ze0ajic0vbv28hcdctpz hello] # ?aasd=hehe - bash : ?aasd=hehe: 未找到命令 |
shell 变量调用
变量的调用使用$符号或者$符号加上花括号。一般来讲使用花括号的用法。
举例说明:
1 2 3 4 5 | [root@iz2ze0ajic0vbv28hcdctpz hello] # apple=hongfushi [root@iz2ze0ajic0vbv28hcdctpz hello] # echo $applepen [root@iz2ze0ajic0vbv28hcdctpz hello] # echo $applepen hongfushipen |
如果不加花括号,就会读成applepen为一个变量,因此解析产生了歧义。
shell 变量分类
- 环境变量:保存操作系统运行时使用的参数。
- 位置变量:传递脚本参数时使用。
- 预定义变量:类似于环境变量,不同是它是不能重定义的。
- 自定义变量:由用户自定义,可用于用户编写的脚本。
自定义变量:
定义变量database:
1 2 3 4 5 6 | [root@iz2ze0ajic0vbv28hcdctpz hello] # database=mysql [root@iz2ze0ajic0vbv28hcdctpz hello] # echo $database mysql [root@iz2ze0ajic0vbv28hcdctpz hello] # echo $database mysql |
环境变量:查看全局环境变量:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | [root@iz2ze0ajic0vbv28hcdctpz ~] # printenv XDG_SESSION_ID=2044 HOSTNAME=iz2ze0ajic0vbv28hcdctpz TERM=xterm-256color SHELL= /bin/bash HISTSIZE=1000 SSH_CLIENT=113.44.42.209 56074 22 SSH_TTY= /dev/pts/1 USER=root MAVEN_HOME= /usr/local/apache-maven-3 .6.0 MAIL= /var/spool/mail/root PATH= /usr/local/apache-maven-3 .6.0 /bin : /usr/local/jdk1 .8.0_191 /bin : /usr/local/sbin : /usr/local/bin : /usr/sbin : /usr/bin : /root/bin PWD= /root JAVA_HOME= /usr/local/jdk1 .8.0_191 LANG=zh_CN.UTF-8 HISTCONTROL=ignoredups SHLVL=1 HOME= /root LOGNAME=root CLASSPATH=.: /lib/dt .jar: /lib/tools .jar SSH_CONNECTION=113.44.42.209 56074 172.17.187.244 22 LC_CTYPE=zh_CN.UTF-8 LESSOPEN=|| /usr/bin/lesspipe .sh %s XDG_RUNTIME_DIR= /run/user/0 _= /usr/bin/printenv |
定义一个环境变量
1 2 3 | [root@iz2ze0ajic0vbv28hcdctpz ~] # export kaka="kaka" [root@iz2ze0ajic0vbv28hcdctpz ~] # env |grep kaka kaka=kaka |
删除环境变量
1 2 | [root@iz2ze0ajic0vbv28hcdctpz ~] # unset kaka [root@iz2ze0ajic0vbv28hcdctpz ~] # env |grep kaka |
w如果长期使用,可以把它们写在配置文件中。/etc/profile 或者 用户家目录的.bash_profile
位置变量 :
我们先定义一个shell。
1 2 3 4 5 6 | [root@iz2ze0ajic0vbv28hcdctpz ~] # cat test.sh #!/bin/bash echo "执行的文件: $0" echo "第一个参数: $1" echo "第二个参数: $2" |
执行查看结果。
[root@iz2ze0ajic0vbv28hcdctpz ~]# chmod +x test.sh
[root@iz2ze0ajic0vbv28hcdctpz ~]# ./test.sh 1 2
执行的文件: ./test.sh
第一个参数: 1
第二个参数: 2
预定义变量:
常用的预定义变量有如下几个。
1 2 3 4 5 6 7 8 | #!/bin/bash echo "执行的文件: $0" echo "第一个参数: $1" echo "第二个参数: $2" echo "所有参数: $*" echo "当前脚本的pid: $" echo "脚本参数个数: $#" |
查看执行结果
[root@iz2ze0ajic0vbv28hcdctpz ~]# ./test.sh 1 2
执行的文件: ./test.sh
第一个参数: 1
第二个参数: 2
所有参数: 1 2
当前脚本的pid: 30170
脚本参数个数: 2
查看上一个命令执行结果。
[root@iz2ze0ajic0vbv28hcdctpz hello]# ls
test
[root@iz2ze0ajic0vbv28hcdctpz hello]# echo $?
0
shell 运算符
shell也是一门语言其实和其他的语言运算符大同小异,不过这里我们还是来说一下。本节说一下运算符相关内容。
运算符种类
- 算数运算符
- 关系运算符
- 布尔运算符
- 逻辑运算符
- 字符串运算符
- 文件测试运算符
算数运算符
命令: expr
作用: 求表达式的值
语法: expr 表达式
规则:
- 运算符号两边要有空格
- 遇到特殊符号如*号需要在前面加反斜杠
- 空格和特殊字符串需要用引号括起来
操作:(先编写一个运算相关的shell脚本)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #!/bin/bash i=1 j=2 addition=` expr $i + $j` subtraction=` expr $i - $j` multiplication=` expr $j \\* $j` division=` expr $j / $i` mod=` expr $j % $i` echo "addition=$addition , subtraction=$subtraction , multiplication=$multiplication , division=$division , mod=$mod" if [ $i == $j ] then echo "i 等于 j" fi if [ $i != $j ] then echo "i 不等于 j" fi |
查看结果:
➜ ~ ./operation.sh
addition=3 , subtraction=-1 , multiplication=4 , division=2 , mod=0
i 不等于 j
关系运算符
操作:(编写脚本)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | #!/bin/bash num1=5 num2=8 if [ $num1 - eq $num2 ] then echo "$num1 是否等于 $num2 : num1 等于 num2" else echo "$num1 是否等于 $num2: num1 不等于 num2" fi if [ $num1 - ne $num2 ] then echo "$num1 是否不等于 $num2: num1 不等于 num2" else echo "$num1 是否不等于 $num2 : num1 等于 num2" fi if [ $num1 -gt $num2 ] then echo "$num1 是否大于 $num2: num1 大于 num2" else echo "$num1 是否大于 $num2: num1 不大于 num2" fi if [ $num1 -lt $num2 ] then echo "$num1 是否小于 $num2: num1 小于 num2" else echo "$num1 是否小于 $num2: num1 不小于 num2" fi if [ $num1 - ge $num2 ] then echo "$num1 是否大于等于 $num2: num1 大于或等于 num2" else echo "$num1 是否大于等于 $num2: num1 小于 num2" fi if [ $num1 - le $num2 ] then echo "$num1 是否小于等于 $num2: num1 小于或等于 num2" else echo "$num1 是否小于等于 $num2: num1 大于 num2" fi |
操作结果:
➜ ~ ./relation.sh
5 是否等于 8: num1 不等于 num2
5 是否不等于 8: num1 不等于 num2
5 是否大于 8: num1 不大于 num2
5 是否小于 8: num1 小于 num2
5 是否大于等于 8: num1 小于 num2
5 是否小于等于 8: num1 小于或等于 num2
布尔运算符
编写脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #!/bin/bash num1=3 num2=23 if [ $num1 != $num2 ] then echo "$num1 != $num2 : num1 不等于 num2" else echo "$num1 != $num2: num1 等于 num2" fi if [ $num1 -lt 25 -a $num2 -gt 15 ] then echo "$num1 小于 25 且 $num2 大于 15 : 返回 true" else echo "$num1 小于 25 且 $num2 大于 15 : 返回 false" fi if [ $num1 -lt 25 -o $num2 -gt 25 ] then echo "$num1 小于 25 或 $num2 大于 25 : 返回 true" else echo "$num1 小于 25 或 $num2 大于 25 : 返回 false" fi |
查看结果:
➜ ~ ./bool.sh
3 != 23 : num1 不等于 num2
3 小于 25 且 23 大于 15 : 返回 true
3 小于 25 或 23 大于 25 : 返回 true
字符串运算符
编写脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #!/bin/bash apple= "apple" pen= "pen" if [ $apple = $pen ] then echo "$apple = $pen : apple 等于 pen" else echo "$apple = $pen: apple 不等于 pen" fi if [ $apple != $pen ] then echo "$apple != $pen : apple 不等于 pen" else echo "$apple != $pen: apple 等于 pen" fi if [ -z $apple ] then echo "-z $apple : 字符串长度为 0" else echo "-z $apple : 字符串长度不为 0" fi if [ -n "$apple" ] then echo "-n $apple : 字符串长度不为 0" else echo "-n $apple : 字符串长度为 0" fi if [ $apple ] then echo "$apple : 字符串不为空" else echo "$apple : 字符串为空" fi |
执行结果:
[root@iz2ze0ajic0vbv28hcdctpz ~]# ./string.sh
apple = pen: apple 不等于 pen
apple != pen : apple 不等于 pen
-z apple : 字符串长度不为 0
-n apple : 字符串长度不为 0
apple : 字符串不为空
逻辑运算符
编写脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #!/bin/bash num1=5 num2=8 if [[ $num1 -lt 10 && $num2 -gt 5 ]] then echo "返回 true" else echo "返回 false" fi if [[ $num1 -lt 10 || $num2 -gt 5 ]] then echo "返回 true" else echo "返回 false" fi |
执行结果:
[root@iz2ze0ajic0vbv28hcdctpz ~]# ./logic.sh
返回 true
返回 true
文件测试运算符
编写脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | ~ cat testfile.sh #!/bin/bash file = "/root/testfile.sh" if [ -r $ file ] then echo "该文件可读" else echo "该文件不可读" fi if [ -x $ file ] then echo "该文件可执行" else echo "该文件不可执行" fi if [ -w $ file ] then echo "该文件可写" else echo "该文件不可写" fi if [ -f $ file ] then echo "该文件是普通文件" else echo "该文件是非普通文件" fi if [ -s $ file ] then echo "该文件为空" else echo "该文件不为空" fi if [ -d $ file ] then echo "该文件是目录" else echo "该文件不是目录" fi |
执行脚本:
➜ ~ ./testfile.sh
该文件可读
该文件可执行
该文件可写
该文件是普通文件
该文件为空
该文件不是目录
shell条件判断&流程控制
其实流程控制的本质是差不多的,只是在语法上稍微有些差别,本节我们来盘一盘。
单分支if
流程示意图:
举例:
1 2 3 4 5 6 7 8 | ➜ if cat if -one.sh #!/bin/bash a=10 if [ a > 5 ] then echo "a 大于 5" fi |
执行结果:
➜ if ./if-one.sh
a 大于 5
双分支if
流程示意图:
举例:
1 2 3 4 5 6 7 8 | ➜ if cat if -double.sh #!/bin/bash age=18 if [ $age - ge 18 ]; then echo "成年" else echo "未成年" fi |
执行结果:
➜ if ./if-double.sh
成年
多分支if语句
流程示意图:
举例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | ➜ if cat if -multi.sh #!/bin/bash money=10 if [ $money -lt 1 ] then echo "1块钱都没有的比皮卡丘决定在家吃土" elif [ $money - ge 1 -a $money -lt 5 ] then echo "老板我要大白兔奶糖" elif [ $money - ge 5 -a $money - le 10 ] then echo "老板我要巧克力" else echo "老板给我拿个鸡腿" fi |
执行结果:
➜ if ./if-multi.sh
老板我要巧克力
到此这篇关于3000字扫盲shell基础知识的文章就介绍到这了。