广西营销型网站公司,lumen wordpress,网站建设教程突,搭建公司网站多少钱本系列博客为MIT的《Missing in CS Class》的课程笔记。 Class2(2020):Shell基础(二)——Shell脚本设计基础
注#xff1a;若无特殊说明#xff0c;本文中带有[]的部分均为可选参数。
脚本文件
脚本语言为解释执行#xff0c;其运行需有解释器#xff0c;如Python。Shel… 本系列博客为MIT的《Missing in CS Class》的课程笔记。 Class2(2020):Shell基础(二)——Shell脚本设计基础
注若无特殊说明本文中带有[]的部分均为可选参数。
脚本文件
脚本语言为解释执行其运行需有解释器如Python。Shell是一种脚本语言其文件扩展名为.sh。脚本文件的首行一般为#! shell_name符号#!被称为shebang其规定该脚本以何种Shell解释器执行。一般采用env(/usr/bin/env)程序到$PATH中查找某种解释器在何位置如#!/usr/bin/env shell若同一行有多条命令用;分隔执行脚本分为子Shell执行与当前Shell执行。若为子Shell执行在不使用export的情形下脚本中定义的各种变量、函数、环境都不会被带回当前Shell若为当前Shell执行则反之可在后续命令中调用脚本中定义的变量、函数等内容。 ./script_name.sh仅当该脚本有可执行权限(x)时根据shebang中规定的解释器创建一个独立子Shell以执行该脚本shell_name ./script_name.sh无论该脚本是否有可执行权限忽略shebang以shell_name创建一个独立子Shell以执行该脚本source ./script_name.sh或. ./script_name.sh无论该脚本是否有可执行权限忽略shebang直接在当前Shell中执行该脚本相当于将脚本中进行的修改注入到当前Shell。
变量 变量赋值Shell与其他多数脚本语言一致变量无需定义直接赋值即可。右值可为数字、字符串、其他变量、数组、命令替换等。namevalue 注意赋值中各符号间不能有任何空格。 变量可被重新赋值使用。 变量使用$name 删除变量unset name 输出: echo如echo $a 格式化输出printf format_string [arg_list]与C中相同 Shell定义了一些保留变量 $0脚本名$1-$9脚本执行的第 i i i 项参数。类似于C中main函数的形参argv[]$所有参数$#参数数量。类似于C中main函数的形参argc$$当前脚本的PID(进程识别码)$?上条程序的返回值。!!上条包含所有参数的完整命令。如执行命令后被返回Permission Denied使用sudo !!即可重新提升执行$_上条命令的最后一项参数。如mkdir 1cd $_
数组、字符串 Shell只支持一维数组所有value都会被视为字符串处理 初始化array_name(value1,value2,...)。 赋值array_name[index]value 随机访问${name[index]}。特别的idx为时代表取数组中所有元素。 关系数组相当于Python中的dic(字典)、C中的map。与普通数组不同关系数组必须声明后才能使用。 声明declare -A array_name 初始化declare -A array_name([key1]value1 [key2]value2 ...)其中key必须唯一。 赋值array_name[key]value 字符串 单引号‘包围的字符串被视为字符串字面常量所有内容将被原样存储变量也不会被替换。如echo $a输出$a双引号“包围的字符串正常替换变量。如echo $a输出:b字符串长度${#name}
命令替换、进程替换 命令替换$(command)command命令的stdout替换$(command)本身。如 today$(date) #将输出赋值给变量
echo $todayfor i in $(ls) ; do #遍历文件echo $i
donecd $(ls)进程替换 输出重定向(command)将command的stdout写入临时文件中可作为其他命令的文件读入。例 diff (ls dir1) (ls dir2)输入重定向(command)将其他命令的stdout写入临时文件中由command读取。效果等价于管道符|
流程控制
选择结构
if…fi
注意Shell中的分支不可为空若不需要就不要写对应的分支。注意在每个condition后都需加then 单分支结构if then ... fi if condition ; thencommand
fi双分支结构if then ... else ... fi if condition ; thencommand
elsecommand
fi多分支结构if then ... elif then ... else ... fi if condition ; thencommand
elif condition ; thencommand
elsecommand
ficondition为布尔表达式时的两种表示形式
[bool_expression]-eq判断两个数字是否相等-ne判断两个数字是否不相等-lt判断数字是否小于-le判断数字是否小于等于-gt判断数字是否大于-ge判断数字是否大于等于。((bool_expression))算术专用的布尔表达式直接使用关系运算符即可。
case...esac
case variable inpattern)command;;[*) #相当于defaultcommand;;]
esac类似于C中的switch顺次进行匹配。case...esac并没有原生的default因此在结尾使用通配符*对未匹配内容进行匹配。
pattern中若有多个匹配规则用|(或)连接如1|2|3。可使用通配符、字符集([])。
循环结构
for
for variable in object ; docommand
done传入列表 for i in 1 2 3 4 5 ; doecho $i
done传入范围序列$(seq)(相当于Python的range()注意Shell的seq的左闭右闭区间) for variable in $(seq start end [foot]) ; docommand
done传入花括号{start..end}等价于$(seq start end)$ for variable in {start..end} ; docommand
donewhile
while condition ; docommand
done当condition为真时循环执行循环体
until
until condition ; docommand
donecondition为假时循环执行循环体直到condition为真
跳转语句
continue跳出循环的当前轮break跳出整个循环
函数
函数定义
function_name() {command[return ...]
}function function_name {command[return ...]
}函数调用
function_name [argv,...]