Shell“语言程序设计基础......“

  • 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                              大于        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  in 
do 
    ...
    ...
done
  • 以下的 judgement 为条件表达式 
  • while 循环
while 
do
    ...
done
  • until 循环(until 循环执行一系列命令直至条件为 true 时停止)
until 
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

Shell“语言程序设计基础......“_第1张图片

关系运算符与分支结构

  • 分支结构
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命令

内置函数 awk

Shell 文件操作与目录操作

你可能感兴趣的:(Linux,操作系统,linux,运维,服务器)