一、变量
1、自定义变量
命名规则:只能使用字母、数字和下划线,而且不可以使用数字开头,不能使用关键字。
1)定义变量:# name=”jiaofan”
2)引用变量:# $name
3)查看变量:# echo $name
4)取消变量:# unset name
5)查看所有变量:# set
6)从键盘输入数据:read -p”输出内容” name
7)三种引号的作用:””弱引
‘’强引
``优先执行
2、环境变量
- export 全局变量。
- 直接声明(子bash都能用):export back_dir=/home/backup
- 转换声明(子bash都能用):export back_dir 将自定义变量转换成环境变量
- 如果要一直使用:将变量加入到/etc/porfile文件中,
案例:设置JAVA的环境变量
[root@localhost jiaofan]# vi /etc/profile
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
[root@localhost jiaofan]# source /etc/profile
注:[root@localhost jiaofan]# vi ~/.bashrc 这个文件=/etc/profile,但是这里面的全局变量只能对本用户生效。
3、位置变量
1)命令 参数1 参数2 参数3 ....9以后特殊定义
$0 $1 $2 $3 $4 $5 $6 $7 $8 $9 .
【注】# 1.sh 1 2 3 4 $3只接受第3个参数。
案例:
[root@localhost jiaofan]# cat b.sh
#!/bin/bash
echo "$0"
echo "$1"
echo "$2"
[root@localhost jiaofan]# ./b.sh jiao fan
./b.sh
jiao
fan
4、系统域变量
变量 | 描述 |
---|---|
UID | 当前帐户的账户ID号 |
USER | 当前帐户的账户名称 |
HISTSIZE | 当前终端的最大历史命令条目数量(最多可以记录多少条历史命令) |
HOME | 当前帐户的根目录 |
LANG | 当前环境使用的语言 |
PATH | 命令搜索路径 |
PWD | 返回当前工作目录 |
RANDOM | 随机返回0到32767的整数 |
$0 | 返回当前工作目录 |
$# | 参数的个数 |
$* | 所有的参数=$@ |
$@ | 所有的参数=$* |
$? | 上一个程序的返回值(0是成功,非零失败) |
$$ | 程序的PID |
$! | Shell最后运行的后台Process的PID |
$- | 使用set命令设定的Flag一览 |
二、算数运算
算数运算有五种方式:
- $((表达式))
- $[表达式]
- let 表达式
- expr 1 + 2
- bc:计算小数
运算符号 | 含义描述 |
---|---|
++ | 自加1 |
– | 自减1 |
+ | 加法 |
- | 减法 |
* | 乘法 |
/ | 除法 |
** | 求幂 |
% | 取余 |
+= | 自加任意数 |
-= | 自减任意数 |
*= | 自乘任意数 |
/= | 自除任意数 |
%= | 对任意数取余 |
&& | 逻辑与 |
|| | 逻辑或 |
> | 大于 |
>= | 大于或等于 |
< | 小于 |
<= | 小于等于 |
表达式1?表达式2:表达式3 | 表达式1成立,执行表达式2,不成立执行表达式3 |
1、整数运算
[root@localhost jiaofan]# echo `expr 1 + 2`
3
[root@localhost jiaofan]# echo $((1+1))
2
[root@localhost jiaofan]# echo $[1+2]
3
[root@localhost jiaofan]# echo $[3>2?2+2:3*2] <==因为3>2成立,所以执行2+2并输出。
4
[root@localhost jiaofan]# x=1;echo $[x++] <==在输出x,先执行x=x+1
1
[root@localhost jiaofan]# x=1;echo $[++x] <==先执行x=x+1,在输出x
2
2、小数运算
人机交互:
[root@localhost jiaofan]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
1.3+3.3
4.6
quit
[root@localhost jiaofan]#
不用人机交互,可以在脚本中直接执行
[root@localhost jiaofan]# echo $((1+1))
2
[root@localhost jiaofan]# echo $(echo "(1+2)*3" | bc)
9
[root@localhost jiaofan]# echo "2+3;8/19" | bc
5
.42
三、比较判断
1、整数的判断与比较
[ 20 -gt 10 ] 大于
[ 20 -lt 10 ] 小于
[ 20 -eq 10 ] 等于
[ 20 -ne 10 ] 不等于
[ 20 -ge 10 ] 大于等于
[ 20 -le 10 ] 小于等于
案例:
root@localhost jiaofan]# ./b.sh
请输入您的密码:yui
您的密码太短!
[root@localhost jiaofan]# cat b.sh
#!/bin/bash
read -p "请输入您的密码:" ps
if [ ${#ps} -lt 7 ]
then
echo "您的密码太短!"
else
echo "您的密码真长!"
fi
2、字符串判断与比较
[ ] 条件设计(内部空格,中括号两侧必须空格)
test a == a
[ = ] 等于
[ != ] 不等于
案例:
[root@localhost jiaofan]# [ abc == abc ] && echo Y || echo N
Y
[root@localhost jiaofan]# [ abc == ab ] && echo Y || echo N
N
[root@localhost jiaofan]# echo $name
jiaofan
[root@localhost jiaofan]# [ -z $name ] && echo Y || echo N
N
[root@localhost jiaofan]# unset name
[root@localhost jiaofan]# echo $name
[root@localhost jiaofan]# [ -z $name ] && echo Y || echo N
Y
[root@localhost jiaofan]#
3、不明确的错误一:等号两边要有空格,不然语法正确,逻辑不正确
[root@localhost jiaofan]# [ abc==c ] && echo Y || echo N
Y
4、不明确的错误二:
因为,当$name为空时,等同于执行了下面第一条指令,是在测试一个空格是否为空。按计算机的理解,空格也是有值的,并非没有值,所以有测试结果总为真;但是程序已经出错了,为了防止这样的错误,将变量用双引号引起来。
[root@localhost jiaofan]# [ -n ] && echo Y || echo N
Y
[root@localhost jiaofan]# [ -n $name ] && echo Y || echo N
Y
[root@localhost jiaofan]# [ -n "$name" ] && echo Y || echo N
N
3、文件属性的判断与比较
符号 | 含义 |
---|---|
-f filename | 当filename 存在时返回真 |
-b filename | 当filename 存在并且是块文件时返回真(返回0) |
-d pathname | 当pathname 存在并且是一个目录时返回真 |
-h filename | 当filename 存在并且是符号链接文件时返回真 (或 -L filename) |
-c filename | 当filename 存在并且是字符文件时返回真 |
-e pathname | 当由pathname 指定的文件或目录存在时返回真 |
-g pathname | 当由pathname 指定的文件或目录存在并且设置了SGID 位时返回真 |
-k pathname | 当由pathname 指定的文件或目录存在并且设置了"粘滞"位时返回真 |
-p filename | 当filename 存在并且是命名管道时返回真 |
-r pathname | 当由pathname 指定的文件或目录存在并且可读时返回真 |
-s filename | 当filename 存在并且文件大小大于0 时返回真 |
-S filename | 当filename 存在并且是socket 时返回真 |
-t fd | 当fd 是与终端设备相关联的文件描述符时返回真 |
-w pathname | 当由pathname 指定的文件或目录存在并且可写时返回真 |
-x pathname | 当由pathname 指定的文件或目录存在并且可执行时返回真 |
-O pathname | 当由pathname 存在并且被当前进程的有效用户id 的用户拥有时返回真(字母O 大写) |
-G pathname | 当由pathname 存在并且属于当前进程的有效用户id 的用户的用户组时返回真 |
file1 -ef file2 | 两个文件使用相同设备、相同inode编号,则返回真,否则返回假 |
file1 -nt file2 | file1比file2更新时返回真;或者file1存在而file2不存在时返回真 |
file1 -ot file2 | file1比file2更旧时返回真;或者file2存在而file1不存在时返回真 |
案例:
[root@localhost ~]# touch ver1.txt
[root@localhost ~]# touch ver2.txt
[root@localhost ~]# mkdir test
[root@localhost ~]# [ -e ver1.txt ] && echo 对 || echo 错 #<==判断是否存在
对
[root@localhost ~]# [ -e test ] && echo 对 || echo 错
对
[root@localhost ~]# [ ! -e test ] && echo 对 || echo 错
错
[root@localhost ~]# [ -f test ] && echo 对 || echo 错 #<==判断test是否为文件
错
[root@localhost ~]# [ -d test ] && echo 对 || echo 错 #<==判断test是否为目录
对
四、[]和[[]]的区别
[[]] 测试 | [] 测试 |
---|---|
< 排序 | 不支持 (仅部分shell解释器支持<) |
> 排序比较 | 不支持(仅部分shell解释器支持>) |
&& 逻辑与 | -a 逻辑与 |
|| 逻辑或 | -o 逻辑或 |
== 匹配模式 | == 字符匹配 |
=~ 正则匹配 | 不支持 |
()分组测试 | ()仅部分sehll解释器支持分组测试 |
[root@localhost ~]# [ $name =~ [a-c] ] && echo 对 || echo 错
-bash: [: =~: 期待二元表达式
错
[root@localhost ~]# [[ $name =~ [a-c] ]] && echo 对 || echo 错
对
[root@localhost ~]# [[ $name =~ j ]] && echo 对 || echo 错
对
[root@localhost ~]# [[ $name =~ [0-9] ]] && echo 对 || echo 错
错