Shell 编程
Shell 语法
变量:字符串、数字、环境变量、参数
条件判断: shell 中的布尔值
程序控制:if\elif\for\while...
命令列表
函数
内置命令
获取命令的执行结果
变量
区分大小写
等号两边无空格
所有变量都是字符串
环境变量
与系统相关的一些全局变量,常用的有:
参数变量
与参数相关的变量:
条件判断: shell 中的布尔值
test 、 [ 命令,用于执行常见判断
例:检查一个文件是否存在
test 字符串比较
string1 = string2
string1 != string2
-n string 字符串不为空则为真
-z string 字符串为 null(空) 则为真
test 算术比较
expression1 -eq expression2 两式相等则为真
-ne 不等
-gt 大于
-ge 大约等于
-lt 小于
-le 小于等于
! expression 非
test 文件测试
-d file 如果文件是一个目录则为真
-f 文件为普通文件则为真
-e 文件存在则为真
-s 文件大小不为0则为真
-r 文件可读则为真
-w 文件可写则为真
-x 文件可执行则为真
示例:
写一个判断 /etc/hosts 文件是否可写的程序,如果可写,打印“yes”,否则打印 “no”
创建一个变量,读取用户输入,如果用户输入yes,则显示“yes”,输入no 则显示 “no”,否则显示“Sorry”
for循环
基本格式:
例:
例:列出 f开头,.sh 结尾的文件
$(command) 用于执行command命令并获取其输出结果
其他示例
计算累加
while 循环
基本格式
例:
until 循环——反复执行直到条件变为真
基本格式
例:
case 语句
基本格式:
命令列表
AND 列表,左边statement执行成功才执行右边,全部执行成功才算成功
OR 列表,从左到右执行一系列命令,直到某条执行成功就算成功,后面的不再被执行
语句块
在某些只允许使用单个语句的地方(比如AND、OR列表中),要使用多条语句,则可以使用{}构造一个语句块
函数
基本格式:
function_name 必须在调用函数前对它定义。
数调用时,脚本的位置参数($* $@ $# $1 $2 $...) 会被替换为函数的参数,函数执行完毕后,会恢复原值
函数中的变量默认为全局作用域,除非使用 local 关键字定义
通过 return 命令可以让函数返回数字值,常用于表示函数执行是否成功。如需返回字符串值,则需在函数中使用 echo,然后再函数外使用 $() 捕获;或者将字符串保存在一个变量中,函数执行完毕后读取该变量。
如果函数没有使用 return 指定返回值,则函数返回值为最后一条命令的退出码
捕获函数输出:
定义局部变量:
结果
命令
break 跳出一层循环,continue 继续下一轮循环
: (冒号)空命令,有时用于简化条件逻辑,相当于 true 的别名。如 while : 为无限循环
. (点,约等于 source 外部命令),通常情况下,脚本执行一条外部命令时会启动一个新的子shell,命令在这个新环境中执行,结束后此环境被丢弃,给父shell返回退出码。但.命令可用于在当前环境中执行外部命令或脚本程序。类似 PHP 的 include()
echo -e 可启用反斜线转义,参考 help echo; -n 不输出换行。
eval ,允许执行动态生成的代码。例:
exec 中断当前shell,执行 exec 所指定的命令
exit n 以退出码n结束运行。0为正常;1—125可用于自定义;126 文件不可执行;127 命令未找到;
export 导出环境变量,后面执行的子进程均可见;
expr ,执行数学运算,如 x=$(expr $x + 1),也可写为 $((...)) ,具体参考 man expr
printf 格式化打印
return n 使函数返回,无参数则返回最后一条命令退出码
set 为shell设置参数变量;如
set $(date); echo $2
可输出date命令的第二列(月)shift ,把所有参数变量左移一个位置,使 $2 变为 $1, $3 变为 $2
unset ,从当前环境中删除变量或函数
命令的执行
$(command) 或 `command` ,捕获command命令执行的字符串输出结果(不是退出码);
算术扩展
$((expression)),类似 expr命令,但比它快
字符串处理
##尽量多找,#尽量少找,找到后去掉前面找过的部分
%,类似#,但是从后往前找
: 开始位置:截取长度
# 字符串长度
:- 如果file变量为空,则返回 default_file,否则返回 file 变量的值
:= 如果file变量为空,则设置file=default_file并返回,否则返回 file 变量的值
:+ 如果file变量不为空,则返回default_file
结果
Last updated