Shell脚本

1、Shell变量介绍

​ Linux中的变量分为系统变量和自定义变量

2、Shell变量的定义

基本语法

  1. 定义变量:变量=值
  2. 撤销变量:unset 变量
  3. 声明静态变量:readonly变量(不能unset)readonly city=beijing

定义变量的规则

  1. 变量名称可以由字母、数字和下划线组成,但不能使用数字开头
  2. 变量两侧不能有空格
  3. 变量名称一般习惯为大写

将命令的返回值赋给变量

  • A=date 两个反引号`将命令引起来,并将结果返回给变量A
  • A=$(date) 等价于反引号

3、设置环境变量

基本语法

  • export 变量名=变量值
  • source 配置文件
  • echo $变量名

4、位置参数变量

基本语法

  • $n 功能描述:n为数字,$0表示命令本身,$1–$9代表第一个到第九个参数,十以上的参数需要用大括号包含(${10})
  • $* 功能描述:代表命令行中所有的参数,把所有的参数看做一个整体
  • $@ 功能描述:代表命令行中所有的参数,不过把每个参数区分对待
  • $# 功能描述:代表命令行中所有参数的个数
1
2
3
4
5
#!/bin/bash
echo "0=$0 1=$1 2=$2"
echo "所有的参数为$*"
echo "所有的参数为$@"
echo "所有的参数为$#"

输出结果如下:

1
2
3
4
5
[root@node1 shell]# bash myshell.sh 12 34
0=myshell.sh 1=12 2=34
所有的参数为12 34
所有的参数为12 34
所有的参数为2

5、预定义变量

基本介绍

​ 就是shell设计者事先已经定义好的变量,可以直接在shell脚本使用

基本语法

  • $$ 功能描述:当前进程的进程号(PID)
  • $! 功能描述:后台运行的最后一个进程的进程号(PID)
  • $? 功能描述:最后一次执行命令的返回状态,如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己决定),则证明上一个命令执行不正确。

6、运算符

基本语法

  1. “$((运算式))”或$[运算式]或者expr m + n
  2. 注意expr运算符间要有空格
  3. expr *,/,% 乘,除,取余
1
2
3
4
5
6
7
8
9
10
#!/bin/bash
RES1=$((2+3))
echo "$RES1"

RES2=$[(2+3)*4]
echo "$RES2"

RES3=`expr 2 + 3`
RES4=`expr $RES3 \* 4`
echo "$RES3 $RES4"

结果如下

1
2
3
4
[root@node1 shell]# bash myshell.sh
5
20
5 20

7、条件判断

1、条件判断语法结构

    1. test 条件表达式
    2. [ 条件表达式 ]
    3. [[[ 条件表达式 ]] 支持正则 =~条件判断相关参数

2、条件判断相关参数

2.1 判断文件类型

判断参数 含义
-e 判断文件是否存在(任意文件类型)
-f 判断文件是否存在,并且是一个普通文件
-d 判断文件是否存在,并且是一个目录
-L 判断文件是否存在并且是一个软连接文件
-b 判断文件是否存在并且是一块设备文件
-c 判断文件是否存在是一个字符设备文件
-S 判断文件是否存在并且是一个套接字文件
-p 判断文件是否存在并且是一个命名管道文件
-s 判断文件是否存在并且是否非空文件

2.2 判断文件权限

判断参数 含义
-r 当前用户对其是否可读
-w 当前用户对其是否可写
-x 当前用户对其是否可执行
-u 是否有suid,高级权限冒险家位
-g 是否sgid,高级权限限制位
-k 是否有t位,高级权限粘滞位

2.3 判断文件新旧

判断参数 含义
file1 -nt file2 比较file1是否比file2新
file1 -ot file2 比较file1 是否比file2旧
file1 -ef file2 比较是否为同一个文件,或者判断硬连接,是否指向同一个inode

2.4 判断整数

判断参数 含义
-eq 相等
-ne 不等
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于

2.5 判断字符串

判断参数 含义
-z 判断是否为空字符串,字符串长度为0则成立
-n 判断是否为空字符串,字符串长度不为0则成立
string1 = string2 判断字符串是否相等
string1 != string2 判断字符串是否不相等

2.6 多重条件判断

判断符号 含义
-a 和 && 逻辑与
-o 和 || 逻辑或

特别说明:

  • && 前面表达式为真,才会执行后面代码
  • || 前面表达式为假,才会执行后面代码
  • ; 用于分割命令或表达式

8、流程控制

8.1 case语句

基本语法

1
2
3
4
5
6
7
8
9
10
11
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "我也不知道周几了"
;;
esac

输出结果:

1
2
3
4
[root@node1 shell]# bash myshell.sh 3
我也不知道周几了
[root@node1 shell]# bash myshell.sh 2
周二

8.2 for循环

语法一

1
2
3
4
for  变量  in  值1  值2  值3
do
程序代码
done
1
2
3
4
5
6
7
8
9
10
#!/bin/bash
for i in "$*"
do
echo "num is $i"
done
echo "================"
for j in "$@"
do
echo "num is $j"
done

输出结果:

1
2
3
4
5
6
[root@node1 shell]# bash myshell.sh 1 22 44
num is 1 22 44
================
num is 1
num is 22
num is 44

语法二

1
2
3
4
for ((初始值;循环控制条件;变量变化))
do
程序代码
done
1
2
3
4
5
6
#!/bin/bash
SUM=0
for (( i=1;i<=$1;i++ )) #两侧括号有空格do
SUM=$[$SUM+$i]
done
echo "SUM=$SUM"

输出结果:

1
2
[root@node1 shell]# bash myshell.sh 100
SUM=5050

8.3 while循环

基本语法

1
2
3
4
while [ 条件判断式 ]   #注意空格
do
程序代码
done
1
2
3
4
5
6
7
8
9
#!/bin/bash
SUM=0
i=0
while [ $i -le $1 ]
do
i=$[$i+1]
SUM=$[$SUM+$i]
done
echo "结果SUM=$SUM"

输出结果:

1
2
[root@node1 shell]# bash myshell.sh 100
结果SUM=5151

8.4 read读取控制台输入

基本语法

1
2
3
4
5
6
7
8
9
10
read (选项) (参数)选项:
-a:将分裂后的字段依次存储到指定的数组中,存储的起始位置从数组的index=0开始。
-d:指定读取行的结束符号。默认结束符号为换行符。
-n:限制读取N个字符就自动结束读取,如果没有读满N个字符就按下回车或遇到换行符,则也会结束读取。
-N:严格要求读满N个字符才自动结束读取,即使中途按下了回车或遇到了换行符也不结束。其中换行符或回车算一个字符。
-p:给出提示符。默认不支持"\n"换行,要换行需要特殊处理,通过$'string'的方式特殊处理,就可以实现换行的功能
-r:禁止反斜线的转义功能。这意味着"\"会变成文本的一部分。
-s:静默模式。输入的内容不会回显在屏幕上。
-t:给出超时时间,在达到超时时间时,read退出并返回错误。也就是说不会读取任何内容,即使已经输入了一部分。
-u:从给定文件描述符(fd=N)中读取数据
1
2
3
#!/bin/bash
read -s -p $'请输入密码:\n' PASSWORD #使用了换行
echo "密码为$PASSWORD"

输出结果:

1
2
3
[root@node1 shell]# bash myshell.sh
请输入密码:
密码为12345