一、变量
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 错
错
2947

被折叠的 条评论
为什么被折叠?



