概述

脚本在日常的开发过程中大概也是必须的一个环节了吧,以前总以为我一个写后台的了解脚本作甚,后面渐渐的发现排查 一些线网问题或者加一些自定义监控、软件自动部署、日志分析脚本的时候,使用脚本还是很方便的, 因此抽时间来学习并总结一下脚本相关的知识。

详解

常见的shell

linux shell程序常见最多的应该就是/bin/bash了,不过除了bash外还会有多种其他的shell,这些shell程序一般 放在/bin或者/user/bin目录下面,当前linux可用的shell脚本都记录在/etc/shells下面,这是一个文本文件, 我们可以直接查看,如下:

1
2
3
4
5
[root@59950cdb5d31 /]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash

SHELL是linux系统中的一个环境变量,可以方便我们快速的查看当前系统中使用的是那个shell应用,具体的如下:

1
2
[root@59950cdb5d31 /]# echo $SHELL
/bin/bash

上看我们可以看到当前shell应用使用的是/bin/bash这个shell应用。

变量


约束:变量只可以由字母、数字、下划线组成,并且只可以字母下划线开头


  • 定义变量: 在shell脚本中,每一个变量都是一个字符串,无论赋值的时候有没有使用引号,因此这里需要注意的就是,即便声明变量的时候 指定的值是数字,在shell中依然会被是为字符串,不过话说回来,到底有没有方法可以指定为整型呢?其实是有的,这就是 declare,不过更多的情况下我们真的没有必要去刻意声明变量是整型。通常情况下,如果字符串中包含了空格或者tab,我们需要 使用引号将对应的value包括起来。
    • 引号之分:值得一提的是我们在定义变量的时候使用单引号或者双引号的含义在变量包含引用其他类型的变量的时候其执行的结果是不一样的
  • 使用变量: 这里使用变量的时候,我们只需要使用$将变量引起来即可,通常情况下我们可以选择{}来
  • 修改变量: 修改变量的时候我们直接指定变量就可以了
  • 命令变量: 当我们希望将某一个命令的执行结果赋给特定变量的时候,我们可以采用`command`的方式,或者$(command),这里一定要 区别于上面引用变量所采用的${}

下面通过一个例子来演示一下变量的使用:

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
[root@59950cdb5d31 home]# cat test.sh
#!/bin/bash

a1="hello"
a2="${a1} world"
a3='$a1'

echo "a1 is: " $a1
echo "a2 is" $a2
echo "a3 is" $a3

a1='world hello'
echo "again a1 is: " $a1

a1=`echo hahaha`
echo "command '' a1 is: " $a1

a1=$(echo hahaha)

echo 'command $ a1 is: ' $a1
[root@59950cdb5d31 home]# ./test.sh
a1 is: hello
a2 is hello world
a3 is $a1
again a1 is: world hello
command '' a1 is: hahaha
command $ a1 is: hahaha

上面的例子中演示了变量最基本的用法,不过还存在一些特殊变量,在工程应用的时候特别有用:

  • $ :该特殊变量代表进程的id,我们可以尝试一下:
1
2
3
4
5
6
[root@59950cdb5d31 home]# echo $$
24
[root@59950cdb5d31 home]# ps
PID TTY TIME CMD
24 pts/0 00:00:00 bash
214 pts/0 00:00:00 ps

特殊变量 |变量| 含义| |—|——-| |$0 |当前脚本的文件名| |$n |传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。| |$# |传递给脚本或函数的参数个数。| |$* |传递给脚本或函数的所有参数。| |$@ |传递给脚本或函数的所有参数。被双引号(“ “)包含时,与 $* 稍有不同,$*被双引号包含的时候,变量会作为一个整体输出,$@则是以空格为分隔符输出所有的参数| |$? |上个命令的退出状态,或函数的返回值。| |$$ |当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。|

值得一提的是$?经常会在判断函数执行结果的时候特别有用,下面仅以一个例子来说明:

1
2
3
4
5
6
7
8
9
随便输入一个错误的命令
[root@59950cdb5d31 home]# prin
bash: prin: command not found
查看上面一个命令的执行结果
[root@59950cdb5d31 home]# echo $?
127
继续查看上面一个命令的执行结果
[root@59950cdb5d31 home]# echo $?
0

大部分情况下,上面一个命令执行成功并推出会返回0,执行失败会返回1,不过这里明显能够看到执行状态为失败的时候返回的可能不是1

总结