文章目录
shell
变量
定义变量
Shell 支持以下三种定义变量的方式:
variable=value
variable='value'
variable="value"
使用变量
使用一个定义过的变量,只要在变量名前面加美元符号$即可,如:
author="ken"
echo $author
echo ${author}
变量名外面的花括号{ }是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:
skill="Java"
echo "I am good at ${skill}Script"
系统变量
在命令行提示符直接执行 env、set 查看系统或环境变量。env 显示用户环境变量,set 显示 Shell 预先定义好的变量以及用户变量。可以通过 export 导出成用户变量。一些写 Shell 脚本时常用的系统变量:
$SHELL 默认 Shell
$HOME 当前用户家目录
$IFS 内部字段分隔符
$LANG 默认语言
$PATH 默认可执行程序路径
$PWD 当前目录
$UID 当前用户 ID
$USER 当前用户
$HISTSIZE 历史命令大小,可通过 HISTTIMEFORMAT 变量设置命令执行时间
$RANDOM 随机生成一个 0 至 32767 的整数
$HOSTNAME 主机名
将命令的结果赋值给变量
Shell 也支持将命令的执行结果赋值给变量,常见的有以下两种方式:
variable=`command`
variable=$(command)
[root@ken ~]# echo "this is ken" >test
[root@ken ~]# mes=`cat test`
[root@ken ~]# echo $mes
this is ken
删除变量
使用 unset 命令可以删除变量。语法:
unset variable_name
变量被删除后不能再次使用;unset 命令不能删除只读变量。
定义只读变量
[root@ken ~]# name=ken
[root@ken ~]# readonly name
[root@ken ~]# echo $name
ken
[root@ken ~]# unset name
-bash: unset: name: cannot unset: readonly variable
变量类型
运行shell时,会同时存在三种变量:
- 局部变量
局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
- 环境变量
所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
- shell变量
shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
特殊变量列表(shell变量)
变量 含义
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$? 上个命令的退出状态,或函数的返回值。:成功会返回 0,失败返回 1
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
运行
#!/bin/bash
echo "File Name: $0"
echo "First Parameter : $1"
echo "First Parameter : $2"
echo "Quoted Values: $@"
echo "Quoted Values: $*"
echo "Total Number of Parameters : $#"
结果
[root@ken ~]# bash test name age
File Name: test
First Parameter : name
First Parameter : age
Quoted Values: name age
Quoted Values: name age
Total Number of Parameters : 2
条件表达式
表达式 实例
[ expression ] [ 1 -eq 1 ]
[[ expression ]] [[ 1 -eq 1 ]]
test expression test 1 -eq 1 ,等同于[]
[root@ken ~]# [ 1 -eq 2 ] && echo "this is true" || echo "this is false"
this is false
[root@ken ~]# [ 1 -eq 1 ] && echo "this is true" || echo "this is false"
this is true
注意:括号中的表达式前后都有空格,否则会报错
整数比较符
比较符 描述 实例
-eq, equal 等于 [ 1 -eq 1 ] 为true
-ne, not equal 不等于 [ 1 -ne 1 ] 为false
-gt, greate than 大于 [ 1 -gt 1 ] 为false
-lt, lesser than 小于 [ 1 -lt 1 ] 为false
-ge, greate or equal 大于或者等于 [ 1 -ge 1 ] 为true
-le, lesser or equal 小于或者等于 [ 1 -le 1 ] 为true
字符串比较符
运算符 描述 实例
== 等于 [ “a” == “a” ] 为true
!= 不等于 [ “a” != “a” ] 为false
-n 字符串长度不等于 0 为真
-z 字符串长度等于 0 为真
注意:使用-n 判断字符串长度时,变量要加双引号,养成好习惯,字符串比较时都加上双引号。
# [ -z $a ] && echo yes || echo no
yes
# [ -n $a ] && echo yes || echo no
yes
# 加了双引号才能正常判断是否为空
# [ -z "$a" ] && echo yes || echo no
yes
# [ -n "$a" ] && echo yes || echo no
文件测试
测试符 描述 实例
-e 文件或者目录存在为真 [ -e path ] path 存在为 true
-f 文件存在为真 [ -f file_path ] 文件存在为 true
-d 目录存在为真 [ -d dir_path ] 目录存在为 true
-r 有读权限为真 [ -r file_path ]file_path有读权限为真
-w 有写权限为真 [ -r file_path ]file_path有写权限为真
-x 有执行权限为真 [ -r file_path ]file_path有执行权限为真
布尔运算符
运算符 描述 实例
! 非关系,条件结果取反 [ ! 1 -eq 2 ]为true
-a 和关系,在[]表达式中使用 [ 1 -eq 1 -a 2 -eq 2 ]为true两者都为真才为真
-o 或关系,在[]表达式中使用 [ 1 -eq 1 -o 2 -eq 1 ]为true两者有一真则为真
逻辑判断符
判断符 描述 实例
&& 逻辑和,在[[]]表达式中或判断表达式是否为真时使用 [[ 1 -eq 1 && 2 -eq 2 ]]为 true
|| 逻辑或,在[[]]表达式中或判断表达式是否为真时使用 [[ 1 -eq 1 || 2 -eq 1 ]]为 true
注意:[] 不支持以上两个逻辑判断符,应该使用布尔运算符
运算表达式
$(()) $((1+1))
$[] $[]