【Shell】Linux 脚本语言

【Shell】Linux 脚本语言

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Ken Thompson 的 sh 是第一种 Unix Shell。

Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。

1 . Shell 有几种?

Linux 的 Shell 种类众多,常见的有:

Bourne Shell (/usr/bin/sh 或 /bin/sh)

Bourne Again Shell (/bin/bash)

C Shell (/usr/bin/csh)

K Shell (/usr/bin/ksh)

Shell for Root (/sbin/sh)

Bourne shell 是 UNIX 最初使用的 shell,并且在每种UNIX上都可以使用,在shell编程方面相当优秀,但在处理与用户的交互方面并不太好。Linux 操作系统缺省的 Bourne Again shell,它是Bourne shell 的扩展,简称 Bash,与Bourne shell 完全向后兼容,并且在Bourne shell的基础上增加、增强了很多特性。

2 . 主要的内容:

2.1 . 变量声明、定义、赋值 的时候不需要加 $,使用 的时候需要加 $符号

your_name="runoob.com"

变量名和等号之间不能有空格,命名规则与其他语言类似:

命名只能使用英文字母,数字和下划线,首个字符不能以数字开头
中间不能有空格,可以使用下划线(_)
不能使用标点符号
不能使用bash里的关键字(可用help命令查看保留关键字)

在使用变量的时候需要使用 $ 符号,花括号可加可不加,但是建议加,这样能看的更清楚。

变量的基本操作:

your_name="yancy_01"  # 声明变量
echo ${your_name}   # 输出变量
your_name="yancy_02"  # 给变量赋值

unset your_name    # 删除变量,变量被删除之后,不能再打印输出,输出内容为空
readonly your_name   # 只读变量,只读变量的值不能被改变

变量的类型:

1) 局部变量:在脚本或命令中定义,仅在当前shell实例中有效,开启与服务器的shell窗口之后,定义的变量属于局部变量。
2) 环境变量:所有的程序,都能访问的系统环境变量,比如:jdk的配置信息
3)shell 变量:shell程序设置的特殊变量,shell文件内部定义的变量,在函数外成为全局变量,在函数体内成为 局部变量。

2.2 字符串

字符串是 shell 编程中最常用的数据类型(shell只有数字和字符串),字符串在使用时可以用单引号,也可以用双引号,也可以不用引号。

单引号限制:
任何字符都能原样输出,单引号字符串的变量无效
单引号字符串中不能出现单独一个单引号,但可以成对出现,作为字符串拼接使用
双引号:
双引号里可以有变量
双引号里可以出现转移字符

字符串的一些常用方法:

your_name="yancy_01 is nice"  
echo ${#your_name}  # 获取字符串的长度

echo ${your_name:0:8}  #提取子字符串  yancy_01

echo `expr index "${your_name}" 0`  #输出 0 在字符串中的位置  7
注意: 以上脚本中 ` 是反引号,而不是单引号 ',不要看错了哦。

2.3 数组仅支持一级数组(不支持多维数组),并且没有限定数据的大小

arrays=(1 2 3 4 5 6 7 8 9)   #定义数组

arrays[0]=1     #定义数组
arrays[1]=2
...

echo ${arrays[1]}   # 读取数组
echo ${arrays[@]}   # 输出所有元素
echo ${arrays[*]}   # 输出所有元素

echo ${#arrays[n]}  #获取数组某个元素的长度
echo ${#arrays[@]}  #获取数组的长度
echo ${#arrays[*]}  #获取数组的长度

2.4 传递参数:在命令行执行脚本的时候,可以传递参数

./test.sh 1 2 3 4 5 
在程序中,用 $1 $2 $3 $4 $5 来接收传递的内容,其中 $0 为脚本的文件名称
$* 与 $@ 区别:

相同点:都是引用所有参数。
不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。

2.5 运算符算法、关系、布尔、字符串、文件测试运算符

算法运算符:原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用,expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

#!/bin/bash

val=`expr 2 + 2`
echo "两数之和为 : $val"
表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2。
完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边。

关系运算符:

布尔运算符:

逻辑运算符:

字符串运算符:

文件测试运算符:

2.6 echo 和 printf

Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出

your_name="yancy_01"
echo ${your_name}       # 输出普通字符串

echo "\"It is a test\""  #输出转义字符  "It is a test"

#!/bin/sh
read name
echo "$name It is a test"  # 文件中使用,读取键盘输入,再输出

echo -e "OK! \n"  #显示换行   -e 开启转义  \n 换行(echo 换一行,\n再换一行)
echo -e "OK! \c"  #不换行     -e 开启转义  \c 不换行(取消echo 的换行效果)

echo "It is a nice day" > myfile.txt   #结果输出到文件
echo  '$name\'    # 完全原样输出 字符串
echo `date`       # 调用 linux 执行,并输出结果

printf 命令模仿 C 程序库(library)里的 printf() 程序,printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好。

printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n

printf 语法:

printf  format-string  [arguments...]

format-string: 为格式控制字符串
arguments: 为参数列表。

2.7 test : 用于检查条件是否成立,可以进行数值、字符和文件三个方面的测试。

2.8 流程控制:

if—–elif—-else—fi

for:

while:

以上实例使用了 Bash let 命令,它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。

utils 循环:

case:

跳出循环:break和continue。 
break 用 ;; 表示
continue 用 continue  表示

2.9 函数:

函数返回值:在调用该函数后通过 $? 来获得
参数:调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值

注意:
所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。
$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。

2.10 输入/输出重定向:

大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。重定向命令列表如下:

输出重定向:
echo "nice" > myfile.txt  # myfile.txt 需要存在,写入成功,会覆盖之前的内容
echo "nice" >> myfile.txt  # myfile.txt 需要存在,写入内容追加在文件内容结尾
输入重定向:
wc -l myfile.txt  # 统计myfil.txt 中有几行内容

Here Document:文档格式重定向(delimiter  分隔符,印象中,阿里的docker使用说明用到了这个地方,来写 setting.conf 配置文件)

阿里云的用户指导

2.11 /dev/null

2.12 引入外部文件 : Shell 也可以包含外部脚本

source 相对路径/绝对路径   # 引入外部 shell文件
. 相对路径/绝对路径        # 引入外部 shell文件

注:被包含的文件 test1.sh 不需要可执行权限。

注意事项:
1. 中括号 [] 与其中间的代码应该有空格隔开
2. 完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边。
3. 比较字符串是否相等,可以字符串后面+x,如果str为空的话,可以防止表达式报错:[: =: unary operator expected

eg:多数图片,来自于菜鸟教程,基本内容也来自菜鸟教程,感谢菜鸟教程。

本来是不用写文章的,直接看菜鸟教程就可以了,但是有些地方有自己的理解之后,没有地方做比标记,所以,把 shell的所有知识点在博客里写一遍,以后 有相关的想法或者脚本,会慢慢补充完善该文章。

0 0 vote
Article Rating
Subscribe
提醒
guest
0 评论
Inline Feedbacks
View all comments