Shell 变量
变量名命名规则:
- 首个字符必须为字母
- 中间不能有空格,可以使用下划线
- 不能使用标点符号
- 不能使用 bash里的关键字
your_name="shell"
使用变量:
echo ${your_name}
只读变量:
readonly your_name
删除变量:(不能删除只读变量)
unset your_name
变量类型
- 局部变量:在脚本或命令中定义,仅在当前 shell实例中有效,其他 shell启动的程序不能访问局部变量
- 环境变量:所有程序(包括 shell启动的程序)都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候 shell脚本也能定义环境变量
- shell 变量:由 shell程序设置的特殊变量。shell 变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了 shell的正常运行
- shell 字符串:
字符串可以用单引号、双引号,也可以不用引号- 单引号:
1)单引号里的任何字符都会原样输出,变量是无效的;
2)单引号字符串里不能出现单引号,使用转义字符的单引号也不行 - 双引号:
1)双引号里可以有变量;
2)双引号里可以出现转义字符
- 单引号:
拼接字符串:
echo "hello, "${your_name}" !"
echo "hello, ${your_name} !"
获取字符串长度:
echo ${#your_name}
截取:(从第三个开始截取三个)
echo ${your_name:2:3}
查找:
your_name=“bashshell”
echoexpr index ${your_name} e
//输出7
- shell 数组:
- bash 支持一维数组,不支持多维数组,并且没有限定数组的大小
- 数组用括号表示,元素之间用空格分开
- 初始化时不需要定义数组的大小,数组元素的下标从0开始
定义数组:
arr=(val1 val2 val3…)
arr[0]=val1读取数组:
val=${arr[0]}val=${arr[@]} //所有元素
获取数组长度:
len=$ {#arr[@]} //数组元素个数
len=$ {#arr[*]}
len=${#arr[0]} //单个元素的长度
-
shell 注释:
以 # 号开头的为注释 -
shell 参数传递:
./test.sh 3 2 1
echo "当前执行的文件:${0}"
echo "第一个参数:${1}"
echo "第二个参数:${2}"
echo "第三个参数:${3}"
echo "参数个数:$#"
echo "以一个单字符串显示所有向脚本传递的参数:$*" //"$1 $2 … $n"
echo "脚本运行的当前进程ID号:$$"
echo "后台运行的最后一个进程的ID号:$!"
echo "返回每个参数:$@" //"$1" "$2" … "$n"
echo "显示Shell使用的当前选项:$-"
echo "显示最后命令的退出状态:$?" //0表示没有错误,其他任何值表明有错误
shell 运算符
和其他编程语言一样,支持多种运算符
- 算数运算符
- 关系运算符
- 布尔运算符
- 字符串运算符
- 文件测试运算符
原生 bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr
expr是一款表达式计算工具,它能完成表达式的求值操作(使用反引号)
两个数相加:
val=`expr 2 + 2`
注意:表达式和运算符之间要有空格;完整的表达式要被 ``(反引号) 包含
算数运算符
a=10
b=20val=`expr $a + $b`
echo “a + b : $val”val=`expr $a - $b`
echo “a - b : $val”val=`expr $a \* $b` //乘号前面必须加反斜杠
echo “a * b : $val”val=`expr $b / $a`
echo “b / a : $val”val=`expr $b % $a`
echo “b % a : $val”if [ $a == $b ] //条件表达式要放在方括号之间,并且要有空格
then
echo “a 等于 b”
fi
if [ $a != $b ]
then
echo “a 不等于 b”
fi
关系运算符
只支持数字,不支持字符串,除非字符串是数字
运算符 | 描述 | 举例a=10 b=20 |
---|---|---|
-eq | 比较两个数是否相等,相等返回true | [ $a -eq $b ]返回false |
-ne | 不相等返回true | [ $a -ne $b ]返回true |
-gt | 左边是否大于右边,大于返回true | [ $a -gt $b ]返回false |
-lt | 左边是否小于右边,小于返回true | [ $a -lt $b ]返回true |
-ge | 左边是否大于等于右边,返回true | [ $a -ge $b ]返回false |
-le | 左边是否小于等于右边,返回true | [ $a -le $b ]返回true |
布尔运算符
运算符 | 描述 | 举例a=10 b=20 |
---|---|---|
! | 非运算 | [ ! false ]返回true |
-o | 或运算 | [ $a -lt 20 -o $b -gt 100 ]返回true |
-a | 与运算 | [ $a -lt 20 -a $b -gt 100 ]返回false |
逻辑运算符
运算符 | 描述 | 举例$a=10 $b=20 |
---|---|---|
&& | 逻辑与 | [[ $a -lt 100 && $b -gt 100 ]] 返回 false |
// | 逻辑或 | [[ $a -lt 100 // $b -gt 100 ]] 返回 true |
字符串运算符
运算符 | 描述 | 举例a=‘abc’ b=‘efg’ |
---|---|---|
= | 两个字符串相等返回true | [ $a = $b ]返回false |
!= | 不相等返回true | [ $a != $b ]返回true |
-z | 字符串的长度,为0返回true | [ -z $a ]返回false |
-n | 字符串的长度,不为0返回true | [ -n $a ]返回true |
str | 字符串不为空返回true | [ $a ]返回true |
文件测试运算符
运算符 | 描述 | 举例file=‘test.sh’ |
---|---|---|
-b | 是块文件设备返回true | [ -b $file ]返回false |
-c | 是字符设备文件返回true | [ -c $file ]返回false |
-d | 是目录返回true | [ -d $file ]返回false |
-f | 是普通文件返回true | [ -f $file ]返回true |
-g | 文件设置了SGID位返回true | [ -g $file ]返回false |
-k | 文件设置了粘着位(Sticky Bit)返回true | [ -k $file ]返回false |
-p | 文件是具名管道返回true | [ -p $file ]返回false |
-u | 文件设置了SUID位返回true | [ -u $file ]返回false |
-r | 是可读文件返回true | [ -r $file ]返回true |
-w | 是可写文件返回true | [ -w $file ]返回true |
-x | 是可执行文件返回true | [ -x $file ]返回true |
-s | 文件不为空返回true | [ -s $file ]返回true |
-e | 文件存在返回true | [ -e $file ]返回true |