3000字扫盲shell基础知识(新手必备)

Posted Ever69

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3000字扫盲shell基础知识(新手必备)相关的知识,希望对你有一定的参考价值。

目录

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 ${apple}pen

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基础知识的文章就介绍到这了。

以上是关于3000字扫盲shell基础知识(新手必备)的主要内容,如果未能解决你的问题,请参考以下文章

3000字扫盲shell基础知识(新手必备)

3000字扫盲shell基础知识(新手必备)

卫朋3000+ 字 | 2022年产品人必备的23个设计类网站(2.0版)

卫朋3000+ 字 | 2022年产品人必备的23个设计类网站(2.0版)

卫朋3000+ 字 | 2022年产品人必备的23个设计类网站(2.0版)

万字总结之设计模式(扫盲篇)