1、Shell变量介绍
Linux中的变量分为系统变量和自定义变量
2、Shell变量的定义
基本语法
- 定义变量:变量=值
- 撤销变量:unset 变量
- 声明静态变量:readonly变量(不能unset)
readonly city=beijing
定义变量的规则
- 变量名称可以由字母、数字和下划线组成,但不能使用数字开头
- 变量两侧不能有空格
- 变量名称一般习惯为大写
将命令的返回值赋给变量
- 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、运算符
基本语法
- “$((运算式))”或$[运算式]或者expr m + n
- 注意expr运算符间要有空格
- 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
|