linux之shell脚本基础

目录

  • 前言
  • 脚本的执行
  • shell脚本书写规范
  • 管道与重定向
  • shell脚本变量
    • 定义新变量
    • read命令
    • 变量的作用范围
    • 特殊变量

         ~~~~~~~~         因为想要面对一个新的开始,一个人必须有梦想、有希望、有对未来的憧憬。如果没有这些,就不叫新的开始,而叫逃亡。 ​​​​
                                                                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                                                                                                 ————玛丽亚·杜埃尼亚斯

前言

shell脚本就是将要执行的命令按顺序保存到一个文件中,并给该文件可执行权限,方便一次性执行的一个程序。主要是方便管理员进行设置或管理,可结合各种shell控制语句以完成更复杂的操作。常用于重复性操作、批量事务处理、自动化运维、服务运行状态监控、定时任务执行等。
linux系统中的shell脚本是一个特殊的应用程序,它在操作系统内核和用户之间充当一个“命令解释器”的角色,负责接收用户输入的操作指令并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。
查看系统默认的shell
在这里插入图片描述
可以通过/etc/shells文件查看当前系统所支持的shell脚本类型。
linux之shell脚本基础_第1张图片

脚本的执行

1、bash script-name 或 sh script-name 这是当脚本文件本身没有执行权限时常使用的方法

2、path/script-name 或./script-name 在当前路径下执行脚本,需要将脚本文件的权限改为可执行。然后使用脚本的绝对路径或相对路径就可以直接执行脚本了。

3、source script-name 或 . script-name 这种方法通常是使用source或 “.”(点号)读入或加载指定的Shell脚本文件,然后依次执行指定的Shell脚本中的语句。这些语句将在当前父 shell 脚本进程中执行(其他几种模式都会启用新的进程执行该脚本进程)。

shell脚本书写规范

一个良好的编程规范将会大大提升开发的效率,并且能够在后期降低对脚本的维护成本。所以脚本的规范变得尤为重要。

一般开头指出哪个解释器来执行脚本中的内容,比如:#!/bin/bash 或 #! /bin/sh sh为bash的软链接。但大多数情况下,更为规范的写法是#!/bin/bash

在shell脚本中,#后面为注释的内容,系统不会执行。仅仅作为开发者的阅读性信息。注释信息尽量不要使用中文,防止乱码的情况。

shell的扩展名为xxx.sh

成对的符号应一次性写胡来,然后在符号中增加内容,防止遗漏。比如:{}、[]、’’、""等。[]两端至少要有1个空格。

流程控制的语句也应该一次性写完,再增添内容,同时注重代码的缩进,让程序更友好易读。

对于常规变量赋值应加双引号"",并且等号前后不能有空格。如果想要文本格式的(不引用命令)应用单引号’’。如果是对命令的引用,应使用反引号``

脚本中的所有符号记住英文状态下书写

管道与重定向

由于shell脚本批处理的特殊性,提取信息及过滤信息的操作就变得重要起来。
管道符
管道符为 ‘|’,它的功能是管道左边的命令结果作为右边命令的输入,并且同一行命令可以使用多个管道。在shell脚本中,管道符通常用来过滤所需要的关键信息。比如:
过滤出以bash结尾的用户
在这里插入图片描述
awk提取信息

[root@localhost ~]# grep "/bin/bash$" /etc/passwd | awk -F: '{print $1,$7}'
#-F 用来指定分隔符号,为指定时则以空格或制表符分隔

在这里插入图片描述
提取磁盘的使用率信息
linux之shell脚本基础_第2张图片

[root@localhost ~]# df -Th |grep "/$" |awk '{print $6}'

在这里插入图片描述
重定向操作

在实际的Linux系统维护中,可以改变输入、输出内容的方向,而不使用默认的标准输入、输出设备,这种操作称为”重定向”

标准输入(STDIN):
默认的设备是键盘,文件编号为0,命令将从标准输入文件中读取在执行过程中需要的输入的数据。

#vim pass.txt
#passwd --stdin boy < pass.txt  #给用户设置密码

标准输出(STDOUT):
默认的设备是显示器,文件编号为1,命令将执行后的输出结果发送到标准输出文件。

#uname -p >kernel.txt    查看CPU类型
#uname -r >>kernel.txt   查看内核版本信息

标准错误(STDERR):
默认的设备是显示器,文件编号为2,命令执行期间的各种错误信息发送到标准错误文件。

# la 2> error.log

命令的输出结果包括了正常的执行信息和错误信息两类,可使用>和2>分别输出到不同的文件,当然也可以使用&>操作符将两类输出信息保存到同一文件中。比如可以重定向到空文件/dev/null中。

shell脚本变量

shell变量用于存放系统和用户需要使用的特定参数。常见的shell变量类型包括自定义变量,环境变量,位置变量,预定义变量。

定义新变量

格式:变量名=变量值
注意:等号两边没有空格。变量名称需以字母或下划线开头,名称中不要包含特殊字符(+ - * / . ? % & #)等
引用和查看变量
需要引用时在变量名前加$,用echo可以同时查看多个变量
linux之shell脚本基础_第3张图片
当变量与参数值混用时需要添加{}以区分开来。
在这里插入图片描述
双引号("")

双引号主要起界定字符串的作用,特别是当要赋值的内容包含空格时,必须以双引号括起来。在双引号的范围内,使用$符号可以引用其他变量的值。
linux之shell脚本基础_第4张图片
单引号(’’)
在单引号的范围内,将无法引用其他变量的值,任何字符都被当做普通字符,即为文本格式。但在赋值内容中包含单引号时,需要使用\进行转义,以免冲突。
linux之shell脚本基础_第5张图片
反引号(``)
反引号括起来的范围必须使能够执行的命令。如:
在一行命令中查找tar命令程序的位置并列出其详细属性。

# ls -lh `which tar`

在这里插入图片描述
使用反引号不能实现嵌套命令替换时,可以使用$()来代替如:
查询提供useradd命令程序的软件包所安装的配置文件位置

# rpm -qc $(rpm -qf $(which useradd))

在这里插入图片描述

read命令

read命令用来提示用户输入信息,从而实现简单的交互过程。执行时将从标准输入设备读入一行内容,并以空格为分隔符,将读入的各字段挨个赋值给指定的变量(多余的内容赋值给最后一个变量)。若指定的变量只有一个,则将整行内容赋值给此变量。

[root@localhost ~]# read -p "请选择覆盖还是追加yes/no?" -t 3 a
#-p指定提示信息 -t 指定输入等待时间(秒)

在这里插入图片描述

变量的作用范围

默认情况下,新定义的变量只在当前的shell环境中有效,因此称为局部变量。当进入子程序或新的子shell环境时,局部变量将无法再使用。为了使用定义的变量在所有的子shell环境中能够继续使用。可以通过内部命令export将指定的变量导出为全局变量。可以同时指定多个变量名称作为参数(不需要使用$),变量名之间以空格分隔。

#export  a  b
# bash
# echo "$a $b"
whoam

使用export导出全局变量的同时,也可以为变量进行赋值。
#export a=”i miss you”
# echo $a
i miss you

set 查看定义的变量
unset Serversion 取消变量
readonly 变量名 设置只读变量,unset不能删除只读变量

特殊变量

环境变量
环境变量指的是出于运行需要而由Linux系统提前创建的一类变量,主要用于设置用户的工作环境,包括用户主目录、命令查找路径、用户当前目录、登录终端等。环境变量的值由Linux系统自动维护,随用户状态的改变而改变。使用env命令可以查看到当前工作环境下的环境变量。
PATH变量用于设置可执行程序的默认搜索路径,当仅指定文件名称来执行命令程序时,Linux系统将在PATH变量指定的目录范围查找对应的可执行文件,如果找不到则会提示”command not found”,此时修改PATH变量或将脚本文件复制到环境变量搜索目录下。
如:向PATH环境变量添加脚本文件目录

# echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin
/root/first.sh
# first.sh
bash: first.sh: 未找到命令...
#PATH=”$PATH:/root”
#first.sh

在Linux系统中,环境变量的全局配置文件为/etc/profile,在此文件中定义的变量作用于所有用户。除此外,每个用户还有自己的独立配置文件(~/.bash_profile)。若要长期变更或设置某个环境变量,应在上述文件中进行设置。
举例:修改历史记录命令条数

# history | wc -l
 # vim /root/.bash_profile 
export HISTSIZE=50
# source /root/.bash_profile 
# history | wc -l

位置变量
为了在使用shell脚本程序时, 方便通过命令行为程序提供操作参数,bash引入了位置变量的概念。当执行命令时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量。
位置变量也称为位置参数,使用$1 $2 $3 …$9表示。

#!/bin/bash
SUM=`expr $1 + $2`
echo "$1+$2"= $SUM
# chmod +x addr2num.sh 
# ./addr2num.sh 15 20
15 +  20= 35
set 1 2 3 

预定义变量
预定义变量是由bash程序预先定义好的一类特殊变量,用户只能使用预定义变量,而不能创建新的预定义变量,也不能直接为预定义变量赋值。预定义变量使用$符号和另一个符号组合表示,常见的有:
$#:表示命令行中位置参数的个数
$*:表示所有位置参数的内容
$?:表示前一条命令执行后的返回状态,返回值为0表示正确执行,返回值为1表示执行异常
$0:表示当前执行的脚本或程序名称

#!/bin/bash
T=`date "+%Y%m%d-%H%M"`
TARFILE=beifen-${T}.tgz
tar zcf $TARFILE $* &>/dev/null
echo "已执行$0脚本"
echo "共完成$#个对象的备份"
echo "具体内容包括:$*"

# ./mybak.sh /boot/grub /mnt/public /root/aa
已执行./mybak.sh脚本
共完成1个对象的备份
具体内容包括:/boot/grub

相关文章:
shell脚本编程循环语句
shell编程之条件判断语句
shell脚本编程之case语句
shell脚本中的函数及调试

你可能感兴趣的:(shell脚本,shell)