计算机等级考试三级Linux应用与开发技术之第四章shell脚本编程基础笔记(上)

目录

Shell编程概述

bash优点

命令记忆功能

自动补全功能

 别名设置功能

shell脚本的运行

Shell基础

常用的通配符

输入 / 输出重定向

输入重定向符 <

输入重定向符 <<

输出重定向符 >

输出追加重定向符 >>

shell编程

变量

         用户自定义变量

         系统预定义变量

         位置参数变量

         环境变量

         变量的查询和删除



Shell编程概述

Shell本身是一个用C语言编写的程序,它是连接用户UNIX/Linux内核的桥梁,用户的大部分工作都是通过shell完成的

Shell使用户能够更加高效、安全地使用Linux内核。

Shell是解释型语言

脚本第一行指出该脚本的解释程序,例如:

#!/bin/bash

#!说明该脚本是用哪一种shell编写的

“ #!/bin/bash ”的作用是:说明该脚本是用哪一种shell编写的,通常放在脚本第一行,从而调用相应的解释程序予以执行

Shell是读取并解释命令的程序,是一个执行任务时不要求特殊权限的常规程序

bash优点

bash优点有命令记忆功能、自动补全功能别名设置功能

命令记忆功能

命令记忆功能  -->  在命令行按上下键就可以找到之前输入的命令。系统为每个用户维护一个命令历史文件 ./bash_history ,它在用户家目录下。~./bash_history 记录的是这一次登录之前所执行过的命令,而至于这一次的登陆所执行的命令都暂存在内存中,退出系统时,历史命令才会记录到./bash_history

自动补全功能

自动补全功能   -->  bash会查看所输入的任何命令,当用户不确定命令或文件的拼写时,使用tab键,shell会尽量自动补全命令或文件,不同版本的shell自动补全键不同,bash中自动补全键是tab。Tab接在命令后面,则为命令补全,tab接在参数后面,则为文件补全。

 别名设置功能

别名设置功能   -->  别名设置就是赋予一条命令或者一条命令的新名称,可以将别名设为缩写,或者使用别名创建已有命令的自定义变体。

shell脚本的运行

 脚本编辑完成后,利用 chmod 命令 修改脚本文件的权限为可执行

[root@ localhost ~]# cat sh01
#! /bin/bash
#ShowHello
echo -n"Enter Your Name:"                   //参数-n的作用是不换行,echo默认换行
read name                                   //从键盘输入
echo "Hello , $name!"                       //显示信息
[root@ localhost ~]# chmod u+x sh01
[root@ localhost ~]# ./sh01

命令和用户的可执行脚本文件是否能够执行,与环境变量PATH有关

环境变量PATH的值决定了shell将到哪些目录中寻找命令或可执行程序,当用户运行一个命令或可执行程序时,Linux在这些目录下按顺序依次搜寻


Shell基础

Shell脚本是文本文件,即由字符组成的文件

文件名的扩展称为通配

常用的通配符

符号

含义

*

匹配任意字符的0次或多次出现

匹配任意单个字符

[ ]

匹配该字符组所限定的任何一个字符

[^ ]或[! ]

匹配不在该字符组中的任何一个字符

{string1,string2,…}

匹配其中一个指定的字符串

(和python正则那块有点像)

* :可以匹配(除 / 斜线)字符外的任何字符,因为/用作路径名中的定界符。例如用户输入ls -l file * ,这个命令就使用了通配符,找出当前目录中以file开头的文件名并执行。

? :匹配任意单个字符(除 / 斜线),例如d?表示以“d”开头的两个字符的文件名;??表示任何两个字符的文件名;?*y表示至少两个字符,并且以“y”结束的文件名。

[ ] : 将一组字符列表括起来,其作用是匹配该字符组所限定的任何一个字符,即指定列表中的任意一个字符。例如space.[co]匹配space.c或space.o;[Hh]*匹配以“H”或“h”开头的文件名。[]中无论由几个字符,都只代表某一个字符;在[]中,可以使用“-”指定字符的范围,例如[0-9]匹配任何0至9的数字。

[! ]或[^ ] : 为了匹配不在列表中的字符,需要在列表开头加一个^或者!,代表反向选择。

{ } {string1,string2,……}匹配string1或string2(或更多)中的一个字符串。例如ls /home/student /home/cs1 /home/re使用{ }(大括号)命令就可以变成:ls /home/{student,cs1,re}

Shell中引号(引用字符)的作用就是确保特殊字符能被正确使用,明确其在什么状态下呈现特殊含义、什么状态下呈现普通含义。

$ 代表引用变量的值,而倒引号(``)代表引用命令

输入 / 输出重定向

shell重定向分为两种,一种是输入重定向,另一种是输出重定向

每个程序都有输入和输出,那么程序应该能够从任何源接受输入,并可以向任何目标输出。

在默认情况下,大多数程序都会从键盘读取输入,并将输出写到显示器。因此在登录时,shell会自动地将程序的输入源设置为键盘,称为标准输入;设置程序运行的正确结果输出到显示器,称为标准输出;将程序运行中的出错信息输出位置也设置为显示器,称为标准错误标准输入、标准输出和标准错误都以文件的方式存在,通常缩写为 stdin、stdout 和 stderr

总结一下,其实输入/输出方向就是数据的流动方向。输入方向就是数据从哪里流向程序。数据默认从键盘流向程序,如果改变了它的方向,数据就从其他方向流入,这就是输入重定向。输出重定向就是数据从程序流向哪里。数据默认从程序流向显示器,如果改变了它的方向,数据就流向其他地方,这就是输出重定向。

输入重定向符 <

输入重定向符“ < ”的作用就是把命令(或可执行文件)的标准输入重新定向到指定文件。例如,bash < sh01 就是使用输入重定向,让bash执行时,直接从sh01中读取相应数据,而不必交互式地从键盘上输入。

输入重定向符 <<

与输出重定向不同,<< 不代表追加的意思。

输入重定向符号<<的作用是使用特定的分界符作为命令输入的结束标志,而不使用默认的Ctrl+D

输出重定向符 >

输出重定向符 > 的作用是把命令(或可执行文件)的标准输出重新定向到指定文件(或其他输出目标)。这样,该命令结果就不在屏幕上显示,而是写入指定文件中,例如

[root@ localhost ~]#cat file1 file2 > file3

当以这种方式将命令的输出写到文件时,这个文件可以存在,也可以不存在。如果这个文件不存在,那么shell将自动创建这个文件,如果这个文件已经存在,那么它的内容将会被覆盖,原文件内容丢失。为了避免原文件内容被覆盖,可以使用输出追加重定向符 >>

输出追加重定向符 >>

输出追加重定向符 >>的作用是把命令(或可执行文件)的标准输出附加到指定文件的后面,而该文件原有内容不被破坏,例如

[root@ localhost ~]#cat file1 file2 >> file3

file1和file2的内容连接起来附加到file3的结尾处,利用cat显示file3的全部内容


shell编程

变量

         用户自定义变量

用户自定义变量时最普通的shell变量,注意:数字不能做变量的开头符,大写字母通常是系统默认的变量,用户自定义变量通常用小写字母。

在程序使用变量的值时,要在变量名前面加上“$”符,表示使用变量的值。

 

         系统预定义变量

常用预定义变量有:

预定义变量作用
$ ?

上一条命令执行后的返回值

(也称返回码,退出状态等)

$ $

当前进程的进程号(PID)

$ !上一个后台命令对应进程号(PID)

$ -

当前在运行shell程序的选项
$ #命令行上参数的个数
$ *  ,  $ @命令行上实际给出的所有实参

 

         位置参数变量

常用的位置参数:

位置参数变量作用

$ n

 n为数字,$0代表命令本身,$1-$9代表第1-9个参数,10以上的参数需要用大括号包含,如 ${ 10 }
$ *代表命令行中所有的参数,把所有的参数看成一个整体
$ @代表命令行中所有的参数,把每个参数区别对待
$ #

命令行上的参数的个数

 

         环境变量

环境变量也是系统预定义变量,环境变量和用户自定义变量还有一个主要区别就在于,环境变量是全局变量,用户自定义变量是局部变量。用户自定义变量只在当前的shell中生效,而环境变量会在当前shell和这个shell的所有子shell中生效。

在bash中可以用env命令列出已经定义的所有环境变量,下面举例说明主要环境变量的使用:

HOME:用户家目录的绝对路径。家目录是用户在开始工作时的位置。不管当前路径在哪都可以通过命令  cd $HOME  或  cd  返回到家目录。

PATH:shell查找命令的目录列表。它是一个非常重要的shell变量。PATH变量包含带冒号分界符的字符串,这些字符串代表存放系统命令的绝对路径。通常,用户会在家目录下建一个bin目录,存放自己编写的所有可执行命令,把这个目录加入PATH变量中,如下:

[root@ localhost ~]#PATH=$PATH:$HOME/bin

PS1:shell主提示符。主提示符是在shell准备接受命令时显示的字符串。PS1定义主提示符是怎样构成的。如果用户没有设置它,bash默认的主提示符如下:

[root@ localhost ~]# echo $PS1
[ \u@ \h \W]\$

系统默认只显示三项,即 \u 、\h、\W,

其中,“ \u ”表示当前用户的用户名;“ \h ”表示主机名的第一个字段(简称),如localhost;“ \W ”显示完整的工作目录,~代表家目录,表示当前工作目录在家目录。

在PS1中常用的转义字符及其含义如下:

\ $提示字符,如果是root用户,提示符为#,普通用户为$
\ t显示时间为24小时格式,如" HH : MM : SS "
\ T显示时间为12小时格式
\ H显示完整主机名
\ s所有shell名称
\ vbash的版本号

PWD:当前工作目录的绝对路径,它指出目录在shell文件系统中处在什么位置。

SHELL:当前使用的shell,它指出shell解析程序放在什么地方。

环境变量和用户自定义变量的作用域不同,是通过 export命令 来设置的。用户自定义变量是局部变量,仅限于自身范围,不能自动传给子进程。

export命令一般使用形式是:

[root@ localhost ~]# export 变量名

用户自定义变量只能在当前shell中有效,而export命令声明的变量在当前shell和所有子shell都有效。

例如:

[root@ localhost ~]# name=zhang
[root@ localhost ~]# bash
[root@ localhost ~]# echo $name

 这时 name变量为空,因为第一句赋值时在父shell中执行的,在执行了bash语句后,处于子shell,在子shell中未对name变量赋值,所有name变量为空

[root@ localhost ~]# name=zhang
[root@ localhost ~]# export name
[root@ localhost ~]# bash
[root@ localhost ~]# echo $name

这时显示name变量为zhang,因为父shell已经通过export声明了变量name,子shell继承该变量

         变量的查询和删除

用户可以定义变量,在不需要的使用该变量的时候也可以注销变量,

注销变量用 unset 命令,一般形式为:

[root@ localhost ~]#unset 变量名

在注销变量前,通常需要查询系统内已有的变量列表,查询所有变量的命令有 set 命令 、 env 命令和 export 命令 。

set 可以查询所有的变量,包括局部变量和全局变量; env 可以查询所有的环境变量,包括本进程及“祖先进程”所设置的全局(环境)变量; export 可以显示本进程利用 export 命令所输出的全部变量。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值