Shell脚本的基础和变量

1.shell脚本基础

1.1 shell的作用

Linux 系统中的 Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当

了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执

行的操作传递给内核执行,并输出执行结果。

常见的 Shell 解释器程序有很多种,使用不同的 Shell 时,其内部指令、命令行提示符

等方面会存在一些区别。通过/etc/shells 文件可以了解当前系统所支持的 Shell 脚本种类。

查看本机的shell信息

查看当前的系统支持的shell

1.2linux中常见的shell

  • bash:基于gun的框架下发展的shell
  • csh:类似c语言的shell
  • tcsh:整合了csh提供了更多功能
  • sh:已经被bash替换
  • nologin:让用户无法登录

bash (/bin/bash)是目前大多数Linux 版本采用的默认shell

1.3shell脚本的本质

shell脚本的本质:命令的集合,命令的本质是程序,那么shell脚本的本质是程序;人类写了一个命令的集合,用bash这个软件,将命令交给硬件去执行;

shell脚本的特点:虽然linux一切皆文件,但是习惯还是将脚本以".sh"结尾,vim编辑器会给脚本中的命令

1.4shell脚本用途

  • 将简单的命令组合完成复杂的工作,自动化执行命令,提高工作效率
  • 减少手工命令的重复输入,一定程度上避免人为错误
  • 将软件或应用的安装及配置实现标准化
  • 用于实现日常性的,重复性的运维工作,如:文件打包压缩备份,监控系统运行状态并实现告警等

1.5脚本执行逻辑及执行方式

1.51脚本执行逻辑

  • 顺序执行:程序按从上到下顺序执行
  • 选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行
  • 循环执行:程序执行过程中需要重复执行多次某段语句

1.5.2脚本执行方式

使用指定的shell解释器:(不需要脚本有执行权限)

会重新加载一个子bash环境去执行,不会影响当前bash环境变量值,常使用。

  • 使用路径执行,需要权限

绝对路径。如:/data/test.sh

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

③使用 “source 脚本名” 或 “ . 脚本名”执行脚本,不需要权限

①和②执行方式不会影响当前环境中bash设置,会开启一个全新的bash环境执行脚本

③不推荐使用,不会启动子shell环境,会影响当前bash环境中的配置

1.6脚本错误调试

1.命令错误

命令出错不会影响接下来的命令继续

hostname

echo 'finsh'

​2.语法错误

会影响接下来的命令继续

echo "hello world"

hstname

​cat > /data/kgc.tx <<EOF

123

123

EOF

echo "ni hao"

 3.逻辑错误

只能自己去筛查

查代码的正确

bash-n 脚本名称 (不在当前目录下加绝对路径)    

检查语法错误

bash-x脚本名称 (不在当前目录下加绝对路径)     逻辑错误

#将脚本的所有语句执行一遍,

总结:脚本错误常见的有三种区别

  • 语法错误,会导致后续的命令不继续执行,可以用bash -n 检查错误,提示的出错行数不一定是准确的
  • 命令错误,默认后续的命令还会继续执行,用bash -n 无法检查出来 ,可以使用 bash -x 进行观察
  • 逻辑错误:只能使用 bash -x 进行

命令错误调试:

在脚本的前面输入 `set -e` ,一旦出错立即停止 

bash -n 脚本名称     //只检查语法错误,不真正执行脚本。定位的错误行可能不准确。 

bash -x 脚本名称     //显示每个命令的执行过程,方便发现逻辑错误

 

1.7重定向与管道符

1.71重定向

类型

设备文件

文件描述编号

默认设备

标准输入

/dev/stdin

0

键盘

标准输出

/dev/stdout

1

显示器

标准错误输出

/dev/stderr

2

显示器

交互式硬件设备

  • 标准输入:从该设备接收用户输入的数据(echo “123” |passwd  --stdin xueyin
  • 标准输出:通过该设备向用户输出数据    ls  /opt
  • 标准错误:通过该设备报告执行出错信息 (ls xxxxxx)

重定向的意思就是 ,不输出到默认设备上,输出到你指定的位置(文件 其他输出设备)

类型

操作符

用途

重定向输入

<

从指定的文件读取数据,而不是从键盘输入

重定向输出

1>

将输出结果保存到指定的文件(覆盖原有内容)

 

>>

将输出结果追加到指定的文件尾部

标准错误输出

2>

将错误信息保存到指定的文件(覆盖原有内容)

2>>

标准错误输出结果追加到指定的文件尾部

混合输出

&>无论对错都可以重定向

将标准输出、标准错误的内容保存到同一个文件中

重定向输入

重定向输出覆盖和追加

第一种,/dev/pts改变输出的终端显示器

第二种:>覆盖

第三种:>>追加

1.72管道符

管道符       |  

将左侧的命令输出结果,作为右侧命令的输入(处理对象)可以 叠加使用

格式:cmd1 | cmd2

2.变量

变量来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念。

保存将来会变化的数据,即使数据变化,直接调用变量即可,各种 Shell 环境中都使用到了“变量”的概念。Shell 变量用来存放系统和用户需要使用的特定参数(值),而且这些参数可以根据用户的设定或系统环境的变化而相应变化。通过使用变量,Shell 程序能够提供更加灵活的功能,适应性更强。

变量基础以及常见的shell变量的类型

变量有5种类型:①自定义变量(自己定义的)、②环境变量(这是系统维护的,如PATH等)、③只读变量、④位置变量、⑤预定义变量

关于自定义变量的命名要求:需要区分大小写、不能使用程序中的保留变量名称,只能使用数字、字母、下划线,且不能以数字开头,注意不支持短横线“-”

命名要求

区分大小写

  • 不能使程序中的保留字和内置变量:如:if, for,hostname   命令  a=  
  • 只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反   
  • 不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH             
  • 大驼峰 StudentFirstName
  • 小驼峰 studentFirstName
  • 下划线 student_name

name='value'

变量名=变量值

直接字串:name='root'

变量引用:name="$USER"

命令引用:name=`COMMAND` 或者 name=$(COMMAND)

注意:变量赋值是临时生效,当退出终端后,变量会自动删除,无法持久保存,脚本中的变量会随着脚本结束,也会自动删除

特殊符号

大括号{ }

{ }确定的变量起始结束的范围 ,只要有变量就加

" "弱引用可以识别变量

' '强引用不识别 变量

` `反撇 调用命令的执行结果 效果与 $()相同

整数运算

expr只能进行整数的运算

格式: expr 变量1 运算符 变量2 [运算符 变量3]

运算符:

加法 +

减法 -

乘法 \ *

除法 /

取余 (取模)%

let var=算术表达式

((var=算术表达式)) 和上面等价

变量1=`expr 变量2  运算符  变量3`(注意空格

使用反撇号调用expr的运算结果,给变量赋值

变量1=$(expr 变量2  运算符  变量3)(注意空格)

使用$()调用expr的运算结果,给变量赋值

环境变量

常用的环境变量,这些都是由系统定义的

$USER 表示用户名称

$HOME 表示用户的宿主目录

$LANG 表示语言和字符集

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

$PATH 表示可执行用户程序的默认路径

环境变量:

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

每开一个窗口就会新加载一个bash,在当前bash下输入bash,就会生成一个子bash,关于环境变量,子bash不会继承父bash的变量值,除非父bash加上export进行变量申明

环境变量的全局配置文件

配置文件位置在

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

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

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

[root@host1:~# ]vim  /etc/profile

.....................省略到行末添加

export PATH=$PATH:/root

[root@host1:~# ]source  /etc/profile

source立即生效或 .

预定义变量

bash   帮你定义好了  拿来用就可以了,你不需要知道为什么,记住

  • $*:表示所有位置参数的内容看成一个整体返回      返回所有         
  • $@:表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回   返回所有 
  • $?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常
  • $#:表示命令行中位置参数的总个数
  • $0:表示当前执行的脚本或程序的名称     当前脚本的名字
  • $$:当前bash的进程id   
  • $!:  后台
  • 任务最后一个id

$? 返回上一次的执行结算,0是正确,非0是错误

$$ 输出当前bash的pid

$0 表示脚本的名称

$# 表示位置参数的总个数

位置变量

位置变量也称为位置参数,使用$1、$2、$3、…、$9 表示

只读变量

变量值不允许修改(重新赋值)的情况

无法使用 unset删除

最快方法重启

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值