一、变量
1、特殊变量
$0 | 脚本的名称 |
$1,$2... | 脚本的参数;当n>=10时,需要使用${n}来获取参数 |
$# | 传递给脚本的参数数量 |
$? | 上一个命令的退出状态 |
$* | 以"$1 $2 … $n"的形式输出所有参数 |
$@ | 以"$1" "$2" … "$n" 的形式输出所有参数 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
2、括号
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界。
例如:
param="123"
echo "I am fine, thank ${param}you"
#不加括号就比较尴尬,$paramyou没有赋值
echo "I am fine, thank $paramyou"
3、单引号
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
例如:
param="123"
#输出:hello, ${param} !
echo 'hello, ${param} !'
单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行);
例如:
#报错
echo 'hello '123 world'
echo 'hello \'123 world'
#输出:hello '123' world
echo 'hello '123' world'
但可成对出现,作为字符串拼接使用。
例如:
param="world"
#输出:hello, world!
echo 'hello, '${param}'!'
4、双引号
双引号里可以有变量,可以出现转义字符。
例如:
#都可以
echo "hello \"123 world"
echo "hello '123 world"
5、字符串
${#string} 或 ${#string[0]} | 获取字符串长度 |
第 2 个字符开始截取 4 个字符 ${string:1:4} | 提取子字符串 |
查找字符 i 或 o 的位置(哪个字母先出现就计算哪个) `expr index "$string" io` | 查找子字符串 |
6、数组
array=(value0 value1 value2 value3) | 定义数组 |
valuen=${array[n]} | 读取数组 |
${array[@]} | 读取数组全部数据 |
${#array[@]}或${#array[*]} | 取得数组元素的个数 |
${#array[n]} | 取得数组单个元素的长度 |
declare -A site site["zhangsan"]="hello, zhangsan" site["lisi"]="hello, lisi" site["wangwu"]="hello, wangwu" | 关联数组 |
${!site[*]}或${!site[@]} | 获取数组的所有键 |
7、注释
多行注释:
:<<EOF
注释内容...
注释内容...
注释内容...
EOF
二、运算符
1、基本运算符
+ | 加 |
- | 减 |
\* | 乘 |
/ | 除 |
% | 除余 |
= | 赋值 |
== | 相等 |
!= | 不相等 |
例如:
#求和(表达式和运算符之间要有空格)
val=`expr 2 + 2`
2、关系运算符
-eq | 是否相等 |
-ne | 是否不相等 |
-gt | 左边的数是否大于右边的 |
-lt | 左边的数是否小于右边的 |
-ge | 左边的数是否大于等于右边的 |
-le | 左边的数是否小于等于右边的 |
3、布尔运算符
! | 非 |
-o | 或 |
-a | 与 |
4、逻辑运算符
&& | 逻辑与 |
|| | 逻辑或 |
5、字符串运算符
= | 是否相等 |
!= | 是否不相等 |
-z | 长度是否为0 |
-n | 长度是否不为0 |
$ | 字符串是否不为空 |
6、文件测试运算符
-b | 是否是块设备 |
-c | 是否是字符设备 |
-d | 是否是目录 |
-f | 是否是普通文件 |
-g | 是否设置了 SGID 位 |
-k | 是否设置了粘着位 |
-p | 是否是有名管道 |
-u | 是否设置了 SUID 位 |
-r | 是否可读 |
-w | 是否可写 |
-x | 是否可执行 |
-s | 是否为空(文件大小是否大于0) |
-e | 是否存在(包括目录) |
7、test 命令
test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
if test -e ./shell.sh
then
echo '文件已存在!'
else
echo '文件不存在!'
fi
三、输入/输出重定向
文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)
command > file | 将输出重定向到 file |
command < file | 将输入重定向到 file |
command >> file | 将输出以追加的方式重定向到 file |
n > file | 将文件描述符为 n 的文件重定向到 file |
n >> file | 将文件描述符为 n 的文件以追加的方式重定向到 file |
n >& m | 将输出文件 m 和 n 合并 |
n <& m | 将输入文件 m 和 n 合并 |
<< tag | 将开始标记 tag 和结束标记 tag 之间的内容作为输入 |
例如:将 stdout 和 stderr 合并后重定向到 file
command > file 2>&1
①将command的标准输出strout(1)重定向到file
②将2(标准错误输出)重定向到1(标准输出)
③所以说1和2都重定向到了file
四、文件包含
. filename # 注意点号(.)和文件名中间有一空格
或
source filename