shell脚本基础

目录

一.shell脚本简介

1. 脚本的组成

①. 声明解释器

②. 注释信息

③. 执行命令

2. 执行脚本方式

①. bash 脚本名

②. 路径/脚本名

③. source(.) 脚本名

3. 脚本执行逻辑

4. 脚本错误

①. 命令错误

②. 语法错误

③. 逻辑错误

5. 脚本错误检查

①. bash  -x  脚本名

②. bash  -n  脚本名

③. 脚本中加入set  -e

④. 脚本中加入set  -u

二.变量基础

1. 管道符  |

2. 重定向

①. 标准输出

②. 错误输出

③. 标准输入

④. 补充

3. 改变输出方向

①. 输出到别的终端设备

②. 输出到文件中

4. 如何设置变量

①. 设置变量

②. 调用变量

③. 重新定义变量

④. 追加变量值

⑤. 删除变量

⑥. export

三. 变量类型

1. 自定义变量

2. 预定义变量

①. $? 

②. $# 

③. $0 

④. $$ 

⑤. $! 

⑥. $* 

⑦. $@ 

3. 环境变量

4. 只读变量

5. 位置变量

6. 特殊符号

7. read  -p

四. 脚本应用

1. 整数运算

①. let

②. expr

③. bc

④. i++与++i

2. 生成随机数

3. 提取系统信息


一.shell脚本简介

shell:人类写的命令集合,用bash(shell软件)翻译给硬件执行。

1. 脚本的组成

①. 声明解释器

#!/bin/bash

表示接下来的命令需要使用什么解释器来解释。

②. 注释信息

以#开头的语句表示为注释信息。

③. 执行命令

2. 执行脚本方式

①. bash 脚本名

直接调用shell解释器,不需要加上权限

shell脚本基础_第1张图片

②. 路径/脚本名

路径:绝对路径/相对路径,需要执行权限

shell脚本基础_第2张图片

③. source(.) 脚本名

不需要加上权限,但是不建议使用

shell脚本基础_第3张图片

注意:source会直接修改当前bash环境参数

shell脚本基础_第4张图片

改为source执行脚本时

shell脚本基础_第5张图片

补充:如果想要脚本全局运行(补齐),需要将脚本软连接到$PASH路径下。

且脚本需要有执行权限。

3. 脚本执行逻辑

①. 顺序执行:程序按从上到下顺序执行

②. 选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行

③. 循环执行:程序执行过程中需要重复执行多次某段语句

4. 脚本错误

①. 命令错误

不会影响接下来的命令执行,但本条命令不会执行

shell脚本基础_第6张图片

②. 语法错误

直接影响脚本无法正常运行

shell脚本基础_第7张图片

③. 逻辑错误

5. 脚本错误检查

①. bash  -x  脚本名

可以发现命令错误和语法错误

shell脚本基础_第8张图片

②. bash  -n  脚本名

可以检查语法错误

shell脚本基础_第9张图片

③. 脚本中加入set  -e

一旦脚本运行出错就会停止运行

shell脚本基础_第10张图片

④. 脚本中加入set  -u

变量不存在就停止

二.变量基础

1. 管道符  |

将第一个命令的执行结果作为后一个命令的处理对象

2. 重定向

重定向:改变电脑数据的输出方向

类型 设备文件 文件描述编号 默认设备
标准输入 /dev/stdin 0 键盘
标准输出 /dev/stdout 1 显示器
标准错误输出 /dev/stderr 2 显示器

shell脚本基础_第11张图片

①. 标准输出

默认电脑数据的输出方向是屏幕,当发了一条指令给电脑,电脑会回复结果给你,结果一定显示在屏幕上。

shell脚本基础_第12张图片

②. 错误输出

如果电脑没有正确回复,称为错误输出。

shell脚本基础_第13张图片

③. 标准输入

通过键盘、鼠标等设备输入给电脑的指令。

④. 补充

类型 操作符 用途
重定向输入 < 从指定的文件读取数据,而不是从键盘输入
重定向输出 1> 将输出结果保存到指定的文件(覆盖原有内容)
>> 将输出结果追加到指定的文件尾部
标准错误输出 2> 将错误信息保存到指定的文件(覆盖原有内容)
2>> 标准错误输出结果追加到指定的文件尾部
混合输出 &>无论对错都可以重定向 将标准输出、标准错误的内容保存到同一个文件中

3. 改变输出方向

①. 输出到别的终端设备

shell脚本基础_第14张图片

②. 输出到文件中

> :覆盖

shell脚本基础_第15张图片

>>:追加

shell脚本基础_第16张图片

4. 如何设置变量

①. 设置变量

变量名=变量值

②. 调用变量

echo  $变量名

shell脚本基础_第17张图片

③. 重新定义变量

变量名=变量值

shell脚本基础_第18张图片

④. 追加变量值

变量名+=变量值

shell脚本基础_第19张图片

⑤. 删除变量

unset  变量名

shell脚本基础_第20张图片

⑥. export

export定义全局变量,可以让变量继承

shell脚本基础_第21张图片

三. 变量类型

1. 自定义变量

由用户自己定义,修改和使用。

shell脚本基础_第22张图片

2. 预定义变量

Bash中内置的一类变量,不能修改。

如:$?   $$   $*   $@   都是shell程序中自带的

shell脚本基础_第23张图片

①. $? 

表示前一条命令执行后的返回状态。

返回值为 0 表示执行正确,返回任何非 0 值均表示执行出现异常

shell脚本基础_第24张图片

②. $# 

表示命令行中位置参数的总个数。

shell脚本基础_第25张图片

③. $0 

表示当前执行的脚本或程序的名称,当前脚本的名字。

shell脚本基础_第26张图片

④. $$ 

当前进程id。

shell脚本基础_第27张图片

⑤. $! 

后台任务最后一个id。

⑥. $* 

代表返回所有参数,所有参数被当成一个整体返回。

shell脚本基础_第28张图片

⑦. $@ 

代表返回所有参数,每个参数都是一个独立的个体返回。

shell脚本基础_第29张图片

3. 环境变量

由系统维护,用于设置工作环境。

env可以看到所有环境中的变量

shell脚本基础_第30张图片

配置文件位置:

/etc/profile如果修改此文件会作用于所有用户

~/.bash_profile 用户独立的配置文件,修改这个文件只作用于当前用户

可以用来长期变更或设置环境变量

4. 只读变量

只可以读不可以改,只能重启。

shell脚本基础_第31张图片

5. 位置变量

通过命令行给脚本传递参数。

如:$1  $2 ......  $n

shell脚本基础_第32张图片

6. 特殊符号

${ } :定义了变量名的范围

"  "  :变量在双引号中可以识别,弱引用

'   '  :变量在双引号中不可以识别,强引用

`   ` :反撇号,代表引用命令执行的结果,效果等于 $()

name='value' 
变量名=变量值
直接字串:name='root'
变量引用:name="$USER"
命令引用:name=`COMMAND` 或者 name=$(COMMAND)
注意:变量赋值是临时生效,当退出终端后,变量会自动删除,无法持久保存,脚本中的变量会随着脚本结束,也会自动删除

变量引用:
$name
${name}

弱引用和强引用
"$name " 弱引用,其中的变量引用会被替换为变量值
'$name ' 强引用,其中的变量引用不会被替换为变量值,而保持原字符串

[root@localhost opt]# producet=kgc
[root@localhost opt]# echo $producet 
kgc
[root@localhost opt]# version=6.0
[root@localhost opt]# echo $producet$version
kgc6.0
[root@localhost opt]# echo "$producet$version"
kgc6.0
[root@localhost opt]# echo '$producet$version'
$producet$version
[root@localhost opt]# echo $producet6.0
.0
[root@localhost opt]# echo ${producet}6.0
kgc6.0
[root@localhost opt]# echo ${producet}$version
kgc6.0



[root@localhost ~]#echo ls
ls
[root@localhost ~]#echo $(ls)
abc.txt anaconda-ks.cfg initial-setup-ks.cfg 公共 模板 视频 图片 文档 下载 音乐 桌面
[root@localhost ~]#echo `ls`
abc.txt anaconda-ks.cfg initial-setup-ks.cfg 公共 模板 视频 图片 文档 下载 音乐 桌面

7. read  -p

从键盘输入的内容变成变量

方法1
[root@localhost opt]# read -p "现在的时间是" time
现在的时间是9点         
[root@localhost opt]# echo $time
9点

方法2
[root@localhost opt]# vim 1.sh
#!/bin/bash
echo -n "请输入你的信息"
read info
echo $info

[root@localhost opt]# bash 1.sh 
请输入你的信息ky15
ky15
[root@192 ~]# read -p "是否覆盖当前文件 (yes/no)" ACK
是否覆盖当前文件 (yes/no)yes
[root@192 ~]# [ $ACK = "yes" ] && echo "覆盖"
覆盖
[root@192 ~]# read -p "是否覆盖当前文件 (yes/no)" ACK
是否覆盖当前文件 (yes/no)no
[root@192 ~]# [ $ACK = "no" ] && echo "不覆盖"
不覆盖

四. 脚本应用

1. 整数运算

运算符:

  • 加法 +
  • 减法 -
  • 乘法 \ *
  • 除法 /
  • 取余 (取模)%

①. let

shell脚本基础_第33张图片

shell脚本基础_第34张图片

②. expr

shell脚本基础_第35张图片

③. bc

shell脚本基础_第36张图片

④. i++与++i

i++  是先赋值再加
++i  是加后再赋值

shell脚本基础_第37张图片

2. 生成随机数

$RANDOM  取值范围:0-32767

[root@localhost ~]# echo $[RANDOM%34+1]

#RANDOM%34 取余
#范围为0~33
#结果+1,表示1~34取随机数

3. 提取系统信息

#!/bin/bash
RED="\E[1;31m"
GREEN="\E[1;32m"
END="\E[0m"
echo -e  "$GREEN----------------------Host systeminfo--------------------$END"
echo -e  "HOSTNAME:     $RED`hostname`$END"
echo -e  "IPADDR:       $RED` ifconfig ens33|grep -Eo '([0-9]{1,3}\.){3}[0-9]
{1,3}' |head -n1`$END"
echo -e  "OSVERSION:    $RED`cat /etc/redhat-release`$END"
echo -e  "KERNEL:       $RED`uname -r`$END"
echo -e  "CPU:         $RED`lscpu|grep 'Model name'|tr -s ' '|cut -d : -f2`$END"
echo -e  "MEMORY:       $RED`free -h|grep Mem|tr -s ' ' : |cut -d : -f2`$END"
echo -e  "DISK:         $RED`lsblk |grep '^sd' |tr -s ' ' |cut -d " " -f4`$END"
echo -e  "$GREEN---------------------------------------------------------$END"

你可能感兴趣的:(linux,服务器,运维)