- Shell语言也有设计基础吗?......
- 没有
- 所谓的语言程序设计基础往往是一种就是菜鸡互啄的一种状态......
- 哦,据说当年,发明笔记本电脑的人(想出发明笔记本电脑这个创意的人)一开始的工作是写说明书的
- Linux 或者 Unix 发明的那个年代应该还没有这种充满了营销的或者应试的表述方法:"...语言程序设计基础"
Shell 程序结构
- Shell 脚本往往在 vim 中编写.
- unix/linux命令
- bash shell 命令
- 程序结构控制语句 和 注释
- Shell 脚本的第一行指出执行脚本的解释器,在 Linux bash 编程中一般为
#!/bin/bash
- 非第一行出现的 # ,都将被视为注释的开始
Linux Shell 变量
- 系统变量: HOME PWD SHELL USER echo $HOME...
- 自定义变量
- Shell 语言是区分空格的,这一点比绝大多数的语言都要好?
- 区分空格是很重要的一件事情!空格他也占内存啊.......
自定义变量规则 变量=值
- 变量名称可以由字母,数字和下划线组成,不能以数字开头
- 等号两侧不能有空格
- 变量名称一般大写
将命令的返回值赋给变量
- 例:
A=$(ls -la)
删除变量
unset
设置环境变量
查看环境变量
Shell 中的运算
- 以下内容只涉及整数
- 查看命令是否被成功执行
$?
#返回0成功执行 返回其他没有成功执行
-
表达式
expr $num1 operator $num2
或者
$(($num1 operator $num2))
- 运算符
| num1|num2 num1不为空且非0,返回num1;否则返回num2
& num1&num2 num1不为空且非0,返回num1;否则返回0
\< num1<num2 num1小于num2,返回1否则返回0
\<= num1<=num2 ................1.......0
!= 不等于 1.......0
\> 大于 1.......0
\>= 大于等于 1........0
=
+
-
\*
/
% 取余
关系运算符
- 关系运算符只支持数值运算,返回 true (在脚本中运行)
Shell 正则表达式
Shell 中的数据类型
- shell 中只有字符串一种数据类型
字符串
单词分割功能
- 空白字符作为单词分隔的字符
- 需要包括空格字符的时候,必须用单引号或者双引号将字符串括起来
创建字符串
- 无引号创建:所有特殊字符作用保留
- 单引号创建:所有字符原样输出,所有特殊字符全部失去作用,单词分割功能失效
- 双引号创建:支持变量替换、命令替换,其它所有字符会原样输出,单词分割功能失效
字符串的长度
${#变量名}
字符串的拼接
- 字符串在一起即为拼接,无需加号辅助
字符串的截取
#shell 字符串 从零开始
${string:position} #从position开始提取子串
${string:position:length} #从position开始提取length长的子串
${string#substring} #从string的开头,删除最短匹配substring的子串
${string##substring} #从string的开头,删除最长匹配substring的子串
${string%substring} #从string的结尾,删除最短匹配substring的子串
${string%%substring} #从string的结尾,删除最长匹配substring的子串
字符串的替换
${string/substring/replacement} #使用replacement代替第一个匹配的substring
${string//substring/replacement} #使用replacement代替所有匹配的substring
${string/#substring/replacement} #如果string的前缀匹配substring, 那么用replacement代替##匹配到的substring
${string/%substring/replacement} #如果string的后缀匹配substring, 那么用replacement代替##匹配到的substring
Shell 中的小数运算(bc)
- bc 是 basic calculator 的简称
- bc 的保留数位由输入小数位数(最多的一位)绝定
从 bash 进入 bc
- 终端输入 bc
- bc 选项
-h, --help: 帮助.
-i, --interactive: 交互模式.
-l, --mathlib: 预置数学程序.
-q, --quiet: 安静模式.
-s, --standard: 标准bc结构输入.
-w, --warn: 非标准结构给出警告.
-v, --version: 版本号.
- 关系运算符
||
&&
!
==
- 数学运算符
+
-
*
/
%
^
- 自增与自减
++
--
- 逻辑运算符
<
>
<=
>=
!=
- 特殊函数
length() #表达式长度
scale() #表达式小数点后位数
sqrt() #平方根
s(x) #sin(x)
c(x) #cos(x)
a(x) #arctan(x)
l(x) #ln(x)
e(x) #exp(x)
j(n,x) #n阶贝塞尔函数
字符串运算符
Shell 语言设计
vim
- 通过 vim 设计 Shell 程序
- vim好啊
参数读取
- bash shell用位置参数变量存储命令行输入的所有参数,包括程序名。其中,$0表示程序名,$1表示第1个参数,$2表示第2个参数,…${11},${12}...
- $*将所有的命令行参数看作一个整体存储
- $@将命令行中以空格间隔的参数单独存储
数组
- Bash Shell 只支持一维数组
- 数组下标由0开始
- 数组用括号表示,数组中元素用空格号分隔开
- 使用与遍历数组时 数组格式要写成 ${arr[@]} 或者 ${arr[*]}
a=(. . . .)
echo ${a[@]}
echo ${a[*]}
-
获取数组的长度
echo ${#数组名[*]}
echo ${#数组名[@]}
- 获取数组某一个元素的值
echo ${数组名[索引值]}
- 数组的分片与截取
${数组名[@]:起始位置:截取长度}
- 数组字符替换
${数组名[@]/旧字符/新字符}
- 删除数组
unset
- 元素追加
- 应用----冒泡排序
循环结构
- for 循环
for <variable> in <list>
do
...
...
done
- 以下的 judgement 为条件表达式
- while 循环
while <judgement>
do
...
done
- until 循环(until 循环执行一系列命令直至条件为 true 时停止)
until <judgement>
do
...
done
- break 命令 (与其他语言基本相同)
- continue 命令 (与其他语言基本相同)
配合循环举例说明1
#!/bin/bash
for((count = 1; count <= $1; count++))
do
echo The $count th output.
done
配合循环举例说明2
#!/bin/bash
count=1
for param in "$*"
do
echo "\$* parameter $count = $param"
count=$[ $count + 1 ]
done
count=1
for param in "$@"
do
echo "\$@ parameter $count = $param"
count=$[ $count + 1 ]
done
关系运算符与分支结构
- 分支结构
if...
then
...
elif...
then
...
else...
...
fi
#!/bin/bash
a=10
b=20
if [ $a -gt $b ]
then
echo "a great than b"
else
echo "a not great than b"
fi
函数
- Shell 中的函数用 return 表示退出并返回一个退出值 脚本中用变量 $? 表示返回值
- 函数格式1
function 函数名 {
...
return ...
}
- 函数格式2
函数名() {
...
return ...
}
函数的参数传递
- 参数传递和其他语言差不多的
- ......
函数变量的作用范围
- Shell 中变量默认全局有效
- 这个显然与很多语言就不同了
- 将变量限定在函数内部需使用local命令