1.变量
1.变量类型
运行shell时,会同时存在3种变量:
- 1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
- 2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
- 3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
# !/bin/bash
# 定义变量
a="test"
echo ${a}
# 循环
for i in 1 2 3 4;do
echo 'i = ${i};'
done
# 只读变量
read_test="abcde"
readonly read_test
read_test="efg" # 错误只读变量不能被改变
# 删除变量
unset read_test # 错误只读变量不能删除
2.shell字符串
单引号、双引号区别
单引号字符串的限制:
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
双引号的优点:
- 双引号里可以有变量
- 双引号里可以出现转义字符
字符串长度
string = "abcde"
echo ${#string} # 字符串长度
echo ${string:1:4} # 字符串第1-4个元素
3.数组
array_test=(a b c d e f)
# 改变数组的值
array_test[0]=b
# 查看所有元素
echo ${array_test[@]}
# 数组长度
echo ${#array_test[@]} # 或 ${#array_test[*]}
# 单个元素长度
echo ${#array_test[1]}
# 遍历数组元素
for i in $array_test;do
echo $i
done
4.注释
# 多行注释
:<<EOF
注释内容...
...
EFO
:<<'
注释内容...
...
'
:<<!
注释内容...
...
!
2.shell传递参数
#!/bin/sh
echo "当前文件名称:$0";
echo "第一个参数为:$1";
echo "参数个数:$#";
echo "字符串输出传递的所有参数:$*"
echo "输出传递的所有参数:$@"
echo "--\$*和\$@区别--"
for i in "$*";do
echo "\$*循环参数,$i"
done
for i in "$@";do
echo "\$@循环参数,$i"
done
$ ./test.sh 1 2 3
当前文件名称:./test2.sh
第一个参数为:1
参数个数:3
字符串输出传递的所有参数:1 2 3
输出传递的所有参数:1 2 3
--$*和$@区别--
$*循环参数,1 2 3
$@循环参数,1
$@循环参数,2
$@循环参数,3
1.*与@ 区别:
- 相同点:都是引用所有参数。
- 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 “1 2 3”(传递了一个参数),而 “@” 等价于 “1” “2” “3”(传递了三个参数)。
参数处理 | 说明 |
---|---|
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数。如"$*“用「”」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与 ∗ 相 同 , 但 是 使 用 时 加 引 号 , 并 在 引 号 中 返 回 每 个 参 数 。 如 " *相同,但是使用时加引号,并在引号中返回每个参数。如" ∗相同,但是使用时加引号,并在引号中返回每个参数。如"@“用「”」括起来的情况、以"$1" “ 2 " … " 2" … " 2"…"n” 的形式输出所有参数。 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
3.shell数组
#!/bin/bash
my_array=(a b c d e f g)
echo "读取数组第$1 个元素,值为:${my_array[$1]}"
$ ./array.sh 1
读取数组第1 个元素,值为:b
4.shell运算符
1.算数运算符
#!/bin/bash
:<<!
expr 算数运算符测试!
。。。
!
# 加法
val=`expr $1 + $2`
echo "$1 + $2 = $val"
# 减法
val=`expr $1 - $2`
echo "$1 - $2 = $val"
# 乘法(需要转义符\)
val=`expr $1 \* $2`
echo "$1 * $2 = $val"
# 除法
val=`expr $1 / $2`
echo "$1 / $2 = $val"
# 取余
val=`expr $1 % $2`
echo "$1 % $2 = $val"
# 赋值
a=$2
echo "$a = $2"
# 相等(表达式写在中括号中间,左右有空格)
if [ $a == $2 ]
then
echo "$a == $2"
fi
# 不等
if [ $a != $2 ]
then
echo "$a != $2"
fi
$ ./expr.sh 1 2
1 + 2 = 3
1 - 2 = -1
1 * 2 = 2
1 / 2 = 0
1 % 2 = 1
2 = 2
2 == 2
2.关系运算符
#!/bin/bash
:<<!
多行注释!
!
a=10
b=20
# 等于 eq
if [ $a -eq $b ]
then
echo "$a -ep $b, a等于b"
else
echo "$a -ep $b,a不等于b "
fi
# 不等于 ne
if [ $a -ne $b ]
then
echo "$a -ne $b,a不等于b"
else
echo "$a -ne $b,a等于b"
fi
# 大于 gt
if [ $a -gt $b ]
then
echo "$a -gt $b,a大于b"
else
echo "$a -gt $b,a不大于b"
fi
# 小于 lt
if [ $a -lt $b ]
then
echo "$a -lt $b,a小于b"
else
echo "$a -lt $b,a不大于b"
fi
# 大于等于 ge
if [ $a -ge $b ]
then
echo "$a -ge $b,a大于等于b"
else
echo "$a -ge $b,a小于b"
fi
# 小于等于 le
if [ $a -le $b ]
then
echo "$a -le $b,a小于等于b"
else
echo "$a -le $b,a大于b"
fi
$ ./orand.sh
10 -ep 20,a不等于b
10 -ne 20,a不等于b
10 -gt 20,a不大于b
10 -lt 20,a小于b
10 -ge 20,a小于b
10 -le 20,a小于等于b
3.布尔运算符
#!/bin/bash
:<<!
布尔运算符
!
a=1
b=2
c=3
# 与 -a
d="$b 大于 $a and $c 大于 $a"
if [ $b -gt $a -a $c -gt $a ]
then
echo "$d True"
else
echo "$d False"
fi
# 或 -o
d="$b 大于 $a 或 $c 大于 $a"
if [ $b -gt $a -o $c -gt $a ]
then
echo "$d True"
else
echo "$d False"
fi
# 非 !
d="$a 不等于 $b"
if [ $a != $b ]
then
echo "$d True"
else
echo "$d False"
fi
$ ./bool.sh
2 大于 1 and 3 大于 1 True
2 大于 1 或 3 大于 1 True
1 不等于 2 True
4.逻辑运算符
运算符 | 说明 | 举例 |
---|---|---|
&& | 逻辑的 AND | [[ $a -lt 100 && $b -gt 100 ]] 返回 false |
|| | 逻辑的 OR | [[ $a -lt 100 || $b -gt 100 ]] 返回 true |
5.字符串运算符
运算符 | 说明 | 举例 |
---|---|---|
= | 检测两个字符串是否相等,相等返回 true。 | [ $a = $b ] 返回 false。 |
!= | 检测两个字符串是否不相等,不相等返回 true。 | [ $a != $b ] 返回 true。 |
-z | 检测字符串长度是否为0,为0返回 true。 | [ -z $a ] 返回 false。 |
-n | 检测字符串长度是否不为 0,不为 0 返回 true。 | [ -n “$a” ] 返回 true。 |
$ | 检测字符串是否为空,不为空返回 true。 | [ $a ] 返回 true。 |
6.文件测试运算符
操作符 | 说明 | 举例 |
---|---|---|
-b file | 检测文件是否是块设备文件,如果是,则返回 true。 | [ -b $file ] 返回 false。 |
-c file | 检测文件是否是字符设备文件,如果是,则返回 true。 | [ -c $file ] 返回 false。 |
-d file | 检测文件是否是目录,如果是,则返回 true。 | [ -d $file ] 返回 false。 |
-f file | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 | [ -f $file ] 返回 true。 |
-g file | 检测文件是否设置了 SGID 位,如果是,则返回 true。 | [ -g $file ] 返回 false。 |
-k file | 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 | [ -k $file ] 返回 false。 |
-p file | 检测文件是否是有名管道,如果是,则返回 true。 | [ -p $file ] 返回 false。 |
-u file | 检测文件是否设置了 SUID 位,如果是,则返回 true。 | [ -u $file ] 返回 false。 |
-r file | 检测文件是否可读,如果是,则返回 true。 | [ -r $file ] 返回 true。 |
-w file | 检测文件是否可写,如果是,则返回 true。 | [ -w $file ] 返回 true。 |
-x file | 检测文件是否可执行,如果是,则返回 true。 | [ -x $file ] 返回 true。 |
-s file | 检测文件是否为空(文件大小是否大于0),不为空返回 true。 | [ -s $file ] 返回 true。 |
-e file | 检测文件(包括目录)是否存在,如果是,则返回 true。 | [ -e $file ] 返回 true。 |
其他检查符:
- -S: 判断某文件是否 socket。
- -L: 检测文件是否存在并且是一个符号链接。