变量
定义变量
- 定义变量时,变量名不加美元符号
- 量名和等号之间不能有空格
- 首个字符必须为字母(a-z,A-Z)
- 中间不能有空格,可以使用下划线(_)
- 不能使用标点符号
- 不能使用 bash 里的关键字
使用变量
只要在变量名前面加美元符号($)
变量名可加上花括号,帮助解释器识别变量边界(推荐加上)
重新定义变量
直接为变量赋值即可
# 定义变量
[root@bogon ~]# username="张三"
# 使用变量
[root@bogon ~]# echo $username
张三
[root@bogon ~]# echo ${username}
张三
# 重新赋值
[root@bogon ~]# username="李四"
只读变量
只读变量不可以被修改,采用readonly 修饰
# 定义变量后修饰
[root@bogon ~]# username="李四"
[root@bogon ~]# readonly username
[root@bogon ~]# username="张三"
-bash: username: readonly variable
# 定义变量时修饰
[root@bogon ~]# readonly address="beijing"
[root@bogon ~]# address="shanghai"
-bash: address: readonly variable
删除变量
直接采用unset 即可
[root@bogon ~]# myurl="www.baidu.com"
[root@bogon ~]# unset myurl
变量类型
1) 局部变量
局部变量在脚本或命令中定义,仅在当前 shell 实例中有效。
2) 环境变量
所有的程序,都能访问环境变量。
3) shell 变量
shell 变量中有一部分是环境变量,有一部分是局部变量。
Shell 特殊变量
特殊变量列表:
变量 | 含义 |
---|---|
$0 | 当前脚本的文件名 |
$n | 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。 |
$# | 传递给脚本或函数的参数个数。 |
$* | 传递给脚本或函数的所有参数。 |
$@ | 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同。 |
$? | 上个命令的退出状态,或函数的返回值。 |
$$ | 当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID。 |
∗和 @ 的区别:
∗和@ 都表示传递给函数或脚本的所有参数,当它们被双引号(" ")包含时,"∗"会将所有的参数作为一个整体,以"1 2…n"的形式输出所有参数;"@"会将各个参数分开,以"1" "2"…"n" 的形式输出所有参数。
[root@bogon ~]# cat ./scripts/args.sh
#!/bin/bash
echo "*打印"
for var in "$*"
do
echo "$var"
done
echo "@打印"
for var in "$@"
do
echo "$var"
done
[root@bogon ~]# sh ./scripts/args.sh zhansan lisi wangwu zhaoliu tianqi
*打印
zhansan lisi wangwu zhaoliu tianqi
@打印
zhansan
lisi
wangwu
zhaoliu
tianqi
退出状态
$?
可以获取上一个命令的退出状态。所谓退出状态,就是上一个命令执行后的返回结果。
退出状态是一个数字,一般情况下,大部分命令执行成功会返回0,失败返回1。
转义字符
加上-e
参数即可
[root@bogon ~]# cat ./scripts/test.sh
#!/bin/bash
lang="java"
echo "hello $lang \n"
echo -e "hello $lang \n"
[root@bogon ~]# sh ./scripts/test.sh
hello java \n
hello java
命令替换
[root@bogon ~]# DATE=`date`
[root@bogon ~]# echo $DATE
2017年 06月 17日 星期六 13:18:44 CST
[root@bogon ~]# USERS=`who | wc -l`
[root@bogon ~]# echo $USERS
3
[root@bogon ~]# cat ./scripts/test.sh
#!/bin/bash
ISSUEINFO=`cat /etc/issue`
echo $ISSUEINFO
[root@bogon ~]# sh ./scripts/test.sh
CentOS release 6.5 (Final) Kernel \r on an \m
变量替换
变量替换可以根据变量的状态(是否为空、是否定义等)来改变它的值
形式 | 说明 |
---|---|
${var} | 变量值 |
${var:-word} | 变量 var 为空或已被删除(unset),返回 word,不改变 var 的值。 |
${var:=word} | 变量 var 为空或已被删除(unset),返回 word,并将 var 的值设置为 word。 |
${var:?message} | 变量 var 为空或已被删除(unset),将消息 message 送到标准错误输出。 |
${var:+word} | 变量 var 被定义,返回 word,不改变 var 的值。 |
运算符
算数运算符
+ 加法
- 减法
* 乘法
/ 除法
% 取余
= 赋值
== 相等。
!= 不相等。
关系运算符
-eq 检测两个数是否相等,相等返回 true。
-ne 检测两个数是否相等,不相等返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。
-ge 检测左边的数是否大等于右边的,如果是,则返回 true。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。
布尔运算符
! 非运算,表达式为 true 则返回 false,否则返回 true。
-o 或运算,有一个表达式为 true 则返回 true。
-a 与运算,两个表达式都为 true 才返回 true。
字符串运算符
= 检测两个字符串是否相等,相等返回 true。
!= 检测两个字符串是否相等,不相等返回 true。
-z 检测字符串长度是否为0,为0返回 true。
-n 检测字符串长度是否为0,不为0返回 true。
str 检测字符串是否为空,不为空返回 true。
文件测试运算符
文件测试运算符用于检测 Unix 文件的各种属性。
-b file 检测文件是否是块设备文件,如果是,则返回 true。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。
-d file 检测文件是否是目录,如果是,则返回 true。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。
-p file 检测文件是否是具名管道,如果是,则返回 true。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。
-r file 检测文件是否可读,如果是,则返回 true。
-w file 检测文件是否可写,如果是,则返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。
Shell注释
注释:以“#
”开头的行,会被解释器忽略。