3.9 KiB
3.9 KiB
shell变量
-
数组
# shell只支持一维数组 array_name = (val0 ... valn) # 数组的定义方式一 array_name[0] = val0 # 数组的定义方式二 ${array_name[index]} # 读取数组的元素 ${array_name[*]} # 读取数组中的所有元素方式一 ${array_name[@]} # 读取数组中的所有元素方式二 ${#array_name[*]} # 获取数组长度方式一 ${#array_name[@]} # 获取数组长度方式二
--------------------
基本格式
- 第1行总是以
#!/bin/sh
开始,通知shell使用何种解释器。 - 以
#
开头的行是注释,建议在第二行注释中写入脚本名。 - 脚本按从上到下的顺序执行。
保留字和元字符
do, done, for, while
if, then, else
.. # 上级目录
. # 当前目录
* # 任意多个字符
? # 任意一个字符
~ # 用户目录
$ # 变量参数
# # 注释
| # 管道
& # 后台执行
&& # 左边的命令返回真后,右边的命令才能执行
|| # 左边的命令执行错误,则执行右边的命令
() # 在当前shell执行括号内的一组命令
{} # 在子shell执行括号内的一组命令
[...] # 匹配括号内的任意一个字符
[!...] # 不包含括号内的所有字符
> # 输出重定向
< #
>> # 追加
条件表达式
# 文件比较
-f文件存在, -d目录存在, -e,文件或目录存在,-s文件存在且非空, -r文件存在且可读, -w, -x
# 字符串比较
==, =, !=, < , >, -n字符串非空, -z字符串为空
# 数字比较
-eq, -ne, -lt, -le, -gt, -ge
# 逻辑运算
-a且,-o或,&&且, ||或
条件控制
- if-then-else
if 条件1
then 命令1 //如果条件1为真,则执行命令1
elif 条件2
then 命令2 //如果条件1为假且条件2为真,则执行命令2
else 命令3 //如果条件1为假且条件2为假,则执行命令3
fi //fi意为if语句终止
其中,elif和else为可选项。 2. case
case 值 in
模式1) 命令1
;;
模式2) 命令2
;;
...
*) 命令n
;;
esac
将值和每一个模式匹配,若匹配则执行相应命令不再与其它模式匹配,否则执行星号后的命令。
循环
- for
# 格式一
for 变量名 in 列表
do
命令1
命令2
...
done
# 格式二
for ((i=0; i<10; i++))
{
命令1
...
}
- until
until 条件
do
命令1
...
done
当条件为真时循环结束,注意测试发生在循环末尾。 3. while
while 条件
do
命令1
...
done
- break
跳出循环或case语句
- continue
跳过当前循环
shell变量
本地变量
- 仅对当前进程有效
环境变量
-
对所有进程有效
-
export导出环境变量
-
env显示环境变量
-
unset清除环境变量
特定变量
!! # 上条命令
!# # 上条命令的名称
!^ # 上条命令的第一个参数
!$ # 上条命令的最后一个参数
!:n # 上条命令的第n个参数
!:n-m # 上条命令从n到m条参数
!:n* # 上条命令从n开始到最后一条参数
!* # 上条命令的所有参数
$0 # 当前脚本的文件名
$num # 表示传递给脚本的第num个参数,num从1开始
$# # 传递给脚本的参数个数
$* # 所有的位置参数
$@ # 所有的位置参数
$? # 上条命令的返回值,成功为0,不成功为非0
$$ # 当前shell的pid
$! # 后台运行的最后一个进程的pid
$- # shell使用的当前选项
$_ # 上条命令的最后一个参数
在变量中切割字符串
${parameter:-word}
${parameter:=word}
${parameter:?word}
${parameter:+word}
${#parameter} # 获取字符串的长度
${parameter%word} # 最小限度从后面截取word
${parameter%%word} # 最大限度从后面截取word
${parameter#word} # 最小限度从前面截取word
${parameter##word} # 最大限度从前面截取word