3000字扫盲shell基础知识

不论前端仍是后端,再学会Linux的基础上,还应该学会写一些简单的Shell。不止是工做,平常中想作一些东西,若是手动作就很累人也费时间,若是你会用Shell脚本处理就很简单了,本文普及的shell的一些基础知识。后面还会持续更新。前端

shell基础语法之变量

shell 变量命名
变量只能由大小写字母,数字和下划线组成。
变量名称不能以数字开头。
变量能够存储数字类型或者字符串类型。
变量赋值等号两边不能有空格。
 字符串的变量能够用单引号或者双引号括起来。
复制代码

定义变量:mysql

➜  ~ name="xiaoka"
➜ ~ age=2 复制代码

无效的定义web

[root@iz2ze0ajic0vbv28hcdctpz hello]# 1212=sfds
-bash: 1212=sfds: 未找到命令 [root@iz2ze0ajic0vbv28hcdctpz hello]# ?aasd=hehe -bash: ?aasd=hehe: 未找到命令 复制代码
shell 变量调用

变量的调用使用$符号或者$符号加上花括号。通常来说使用花括号的用法。 举例说明:sql

[root@iz2ze0ajic0vbv28hcdctpz hello]# apple=hongfushi
[root@iz2ze0ajic0vbv28hcdctpz hello]# echo $applepen  [root@iz2ze0ajic0vbv28hcdctpz hello]# echo ${apple}pen hongfushipen 复制代码

若是不加花括号,就会读成applepen为一个变量,所以解析产生了歧义。shell

shell 变量分类
  • 环境变量:保存操做系统运行时使用的参数。
  • 位置变量:传递脚本参数时使用。
  • 预约义变量:相似于环境变量,不一样是它是不能重定义的。
  • 自定义变量:由用户自定义,可用于用户编写的脚本。

自定义变量: 定义变量database:apache

[root@iz2ze0ajic0vbv28hcdctpz hello]# database=mysql
 [root@iz2ze0ajic0vbv28hcdctpz hello]# echo $database mysql [root@iz2ze0ajic0vbv28hcdctpz hello]# echo ${database} mysql 复制代码

环境变量: 查看全局环境变量:后端

[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 LS_COLORS=rs=0:di=38;5;27:ln=38;5;51:mh=44;38;5;15:pi=40;38;5;11:so=38;5;13:do=38;5;5:bd=48;5;232;38;5;11:cd=48;5;232;38;5;3:or=48;5;232;38;5;9:mi=05;48;5;232;38;5;15:su=48;5;196;38;5;15:sg=48;5;11;38;5;16:ca=48;5;196;38;5;226:tw=48;5;10;38;5;16:ow=48;5;10;38;5;21:st=48;5;21;38;5;15:ex=38;5;34:*.tar=38;5;9:*.tgz=38;5;9:*.arc=38;5;9:*.arj=38;5;9:*.taz=38;5;9:*.lha=38;5;9:*.lz4=38;5;9:*.lzh=38;5;9:*.lzma=38;5;9:*.tlz=38;5;9:*.txz=38;5;9:*.tzo=38;5;9:*.t7z=38;5;9:*.zip=38;5;9:*.z=38;5;9:*.Z=38;5;9:*.dz=38;5;9:*.gz=38;5;9:*.lrz=38;5;9:*.lz=38;5;9:*.lzo=38;5;9:*.xz=38;5;9:*.bz2=38;5;9:*.bz=38;5;9:*.tbz=38;5;9:*.tbz2=38;5;9:*.tz=38;5;9:*.deb=38;5;9:*.rpm=38;5;9:*.jar=38;5;9:*.war=38;5;9:*.ear=38;5;9:*.sar=38;5;9:*.rar=38;5;9:*.alz=38;5;9:*.ace=38;5;9:*.zoo=38;5;9:*.cpio=38;5;9:*.7z=38;5;9:*.rz=38;5;9:*.cab=38;5;9:*.jpg=38;5;13:*.jpeg=38;5;13:*.gif=38;5;13:*.bmp=38;5;13:*.pbm=38;5;13:*.pgm=38;5;13:*.ppm=38;5;13:*.tga=38;5;13:*.xbm=38;5;13:*.xpm=38;5;13:*.tif=38;5;13:*.tiff=38;5;13:*.png=38;5;13:*.svg=38;5;13:*.svgz=38;5;13:*.mng=38;5;13:*.pcx=38;5;13:*.mov=38;5;13:*.mpg=38;5;13:*.mpeg=38;5;13:*.m2v=38;5;13:*.mkv=38;5;13:*.webm=38;5;13:*.ogm=38;5;13:*.mp4=38;5;13:*.m4v=38;5;13:*.mp4v=38;5;13:*.vob=38;5;13:*.qt=38;5;13:*.nuv=38;5;13:*.wmv=38;5;13:*.asf=38;5;13:*.rm=38;5;13:*.rmvb=38;5;13:*.flc=38;5;13:*.avi=38;5;13:*.fli=38;5;13:*.flv=38;5;13:*.gl=38;5;13:*.dl=38;5;13:*.xcf=38;5;13:*.xwd=38;5;13:*.yuv=38;5;13:*.cgm=38;5;13:*.emf=38;5;13:*.axv=38;5;13:*.anx=38;5;13:*.ogv=38;5;13:*.ogx=38;5;13:*.aac=38;5;45:*.au=38;5;45:*.flac=38;5;45:*.mid=38;5;45:*.midi=38;5;45:*.mka=38;5;45:*.mp3=38;5;45:*.mpc=38;5;45:*.ogg=38;5;45:*.ra=38;5;45:*.wav=38;5;45:*.axa=38;5;45:*.oga=38;5;45:*.spx=38;5;45:*.xspf=38;5;45: 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 复制代码

定义一个环境变量bash

[root@iz2ze0ajic0vbv28hcdctpz ~]# export kaka="kaka"
[root@iz2ze0ajic0vbv28hcdctpz ~]# env |grep kaka kaka=kaka 复制代码

删除环境变量app

[root@iz2ze0ajic0vbv28hcdctpz ~]# unset kaka
[root@iz2ze0ajic0vbv28hcdctpz ~]# env |grep kaka 复制代码

w若是长期使用,能够把它们写在配置文件中。 /etc/profile 或者 用户家目录的.bash_profileless

位置变量 : 咱们先定义一个shell。

[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 复制代码

预约义变量: 经常使用的预约义变量有以下几个。

#!/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脚本)

#!/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 复制代码

关系运算符

操做:(编写脚本)

#!/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 复制代码
布尔运算符

编写脚本:

#!/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 复制代码
字符串运算符

编写脚本:

#!/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 : 字符串不为空 复制代码
逻辑运算符

编写脚本:

#!/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 复制代码
文件测试运算符

编写脚本:

~ 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

流程示意图:

举例:

if cat if-one.sh
#!/bin/bash a=10  if [ a > 5 ] then  echo "a 大于 5" fi 复制代码

执行结果:

if ./if-one.sh
a 大于 5 复制代码
双分支if

流程示意图:

举例:

if cat if-double.sh
#!/bin/bash age=18 if [ $age -ge 18 ]; then  echo "成年" else  echo "未成年" fi 复制代码

执行结果:

if ./if-double.sh
成年 复制代码
多分支if语句

流程示意图:

举例:

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
老板我要巧克力 复制代码

本文更新了一些shell的基础知识,若是要学就不要复制,请手打。持续更新。。。⛽️

本文使用 mdnice 排版

相关文章
相关标签/搜索