Shell脚本基础

158 阅读5分钟

常见的shell解释器

Linux系统中的Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当一个”命令解释器“的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出结果。 它是用户使用 Linux 的桥梁。

Shell 既是一种命令语言,又是一种程序设计语言。

常见的 Shell 解释器程序有很多种,使用不同的 Shell 时,其内部指令、命令行提示符等方面会存在一些区别。通过/etc/shell 文件可以了解当前系统所支持的 Shell 脚本种类。

查看本机的shell信息

image.png

linux中常见的shell

bash:基于GUN的框架下发展的shell(是目前大多数 Linux 版本采用的默认 shell。) csh:类似C语言的shell tcsh:整合了csh 提供了更多功能 sh:已经被bash替换 nologin:让用户无法登录

bash特性

支持快捷键:比如 ctrl+c 强制终止进程 、 ctrl+l 清屏 、Tab补齐 等等。 支持查看历史命令(history) 支持别名(alias) 标准输入和标准输出的重定向 管道符 文件名通配机制 支持命令hash 支持变量

shell脚本基本结构

1.脚本申明(申明解释器) :第一行开头 “#!/bin/bash”,表示此行以下的代码语句是通过/bin/bash程序来执行。还有其他类型的解释器,比如 #/usr/bin/python、#!/usr/bin/expect 。

2.注释信息: 以“#”开头的语句表示为注释信息,被注释的语句在脚本运行时不会被执行。

3.可执行语句: 如echo命令,用于输出“ ”之间的字符串。

脚本的执行方式

1.指定路径去执行文件(文件需要执行权限)

绝对路径。如:/root/demo.sh

image.png

相对路径。如:./demo.sh

image.png

2.指定解释器去执行(bash 脚本名),不需要执行权限

bash 脚本名。如:bash demo.sh

image.png

重定向和管道符

标准输入和输出

类型设备文件文件描述符默认情况对应文件句柄位置
标准输入/dev/stdin0从键盘获得输入/proc/self/fd/0
标准输出/dev/stdout1输出到屏幕/proc/self/fd/1
错误输出/dev/stderr2输出到屏幕/proc/self/fd/2

交互式硬件设备:

标准输入:从该设备接收用户输入数据。

标准输出:通过该设备想用户输出数据。

标准错误:通过该设备报告执行出错信息。

重定向

重定向的意思就是,不通过标准输出到默认屏幕上,而是输出到你指定的位置

输入重定向

符号作用
命令 < 文件从指定的文件读取文件,而不是从键盘输入
命令 << 分界符从标准输入中读入,直到遇见分界符才停止
命令 < 文件1 > 文件2将文件1 作为命令的标准输入并将标准输出到文件2

输出重定向

符号作用
命令 > 文件将标准输出结果保存到指定的文件中(覆盖原有内容)
命令 >> 文件将标准输出结果追加到指定的文件尾部
命令 2> 文件将错误输出信息保存到指定文件中(覆盖原有内容)
命令 2>> 文件将错误输出信息追加到指定文件尾部
命令 > 文件 2>&1混合输出,将标准输出与错误输出保存到一个文件中(覆盖原有内容)
命令 &> 文件混合输出,将标准输出与错误输出保存到一个文件中(覆盖原有内容)
命令 &>> 文件混合输出,将标准输出与错误输出追加到一个文件尾部
标准输出重定向

image.png

标准错误重定向

image.png

混合输出重定向

image.png

shell中的算术运算

运算表达式

image.png

运算演示

运算法则

image.png

expr

image.png

$( )和反撇号

image.png

let 和 (( ))

image.png

$(())

image.png

$[]

image.png

小数运算

Bash内置了对整数运算的支持,但是并不支持浮点运算,而 bc 计算器可以很方便的进行浮点运算。

echo "算术表达式" | bc

image.png

awk命令

image.png

生成随机数

echo $[RANDOM%n]

image.png

shell脚本中的变量

变量概述

变量即在程序运行过程中它的值是允许改变的量。

变量是用一串固定的字符串去表示不固定的内容。

变量表示命令的内存空间,将数据放在内存空间中,通过变量名引用,获取数据。

变量的作用

用来存放系统和用户需要使用的特定参数(值)。

变量名:使用固定的名称,由系统预设或用户定义。

变量值:能够根据用户设置、系统环境的变化而变化。

特殊变量

环境变量(全局变量):全局生效,在任何bash环境中都可以识别。

只读变量:read only, 只可以读取不可以更改 。

位置变量: 通过命令行给脚本传递参数 。n(n是正整数),n(n是正整数),n(n是正整数),{10} 要加花括号。

预定义变量:用来保持脚本程序的执行信息。

环境变量

使用env命令查看所有环境变量:

image.png

常用的环境变量

$PATH 表示可执行文件的默认路径

$USER 表示用户名称

$HOME 表示用户的宿主目录

$LANG 表示语言和字符集

$PWD 表示当前所在工作目录

image.png

环境变量的特性

可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量。 一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程。 一般只在系统配置文件中使用,在脚本中较少使用。

全局配置文件

/etc/profile,修改此文件会作用于所有用户。

用户独立的配置文件

~/.bash_profile,修改这个文件只作用于当前用户。

全局配置文件

image.png

image.png

image.png

image.png

只读变量

image.png

位置变量

位置变量也称为位置参数。

使用$n表示,n为数字序列号,且必须为整数。

image.png

image.png

预定义变量

预定义变量是系统定义好的变量,用来保持脚本程序的执行信息。

可以直接使用这些变量,不能直接为这些变量赋值。

变量作用
$?表示前一条命令执行后的返回状态。返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常。
$*表示所有位置参数的内容。当整体返回。(将输入的参数作为一个单词)
$@表示所有位置参数的内容。当个体返回。可作为数组。(将参数内容分割成n份,每份作为独立个体)
$#表示命令行中位置参数的总个数。
$0表示当前脚本名称(如果是软链接,显示当前软链接文件名)。
$_表示在此之前执行的命令或脚本的最后一个参数。
$$获取当前进程的PID。

$?

image.png

0,$$,#,$@

image.png

image.png