Bash Shell

2022-09-04 22:09:32 浏览数 (1)

1.shell简介:

shell为用户与Kernel之间的一个接口:shell主要是一个命令解释器,它接受并解释用户输入的命令,然后将这些命令传给内核,最后由内核来执行这些命令。Bourn shell是现在所有shell的始祖,C shell增加了若干Bourn shell没有的特性,如命令行历史、别名和作业控制等。Korn shell增加了若干Bourn shell的超集,它具有类似C shell的加强功能。bash与Bourn shell兼容同时加入了csh、ksh和tcsh的一些有用的功能、GNU项目开发、也是实际上的标准Linux shell。系统中所有shell都存放在/etc/shells文件中。

bash内置的命令type:

Linux操作系统的命令分为两大类:

1.内部命令、即内置在bash中的命令

2.外部命令、即该命令不是内置在bash中的,外部命令以可执行文件的方式存储在Linux的文件系统中。使用方法为:type [选项] 命令名

type命令中常用的选项:

-a ~ 列出所有包含指定命令名的命令、也包括别名(alias)

-p ~ 显示完整的文件名(外部命令),或者为内部命令

-t ~ 显示文件的类型,其文件类型如下:

file:为外部命令

alias:为别名

builtin:为bash的内置命令

通配符:

通配符也称元字符是描述其他数据的字符。Linux操作系统提供的主要通配符如下:

*/:将匹配0个字符(即空白)多个字符

?:将匹配任何一个字符而且只能是一个字符

 [a-z]:将匹配字符a~z范围内的所有字符

 [^a-z]:将匹配所有字符但是a~z范围内的字符除外

 [xyz]:将匹配方括号中的任意一个字符

 [^xyz]:将匹配不包括方括号中的字符的所有字符

利用Tab键补齐命令行:

当在键盘上按Tab键时:如果光标在命令上,将补齐一个命令行。如果光标在参数上,将补齐一个文件名,如在bash提示符下输入whoa,而此时光标在a之后,当按Tab键之后系统会自动补齐该命令剩余的字符------whaami。如在bash提示符下输入file dog,连续按两次Tab键就会显示所有以dog开头的文件名。

命令行中~符号的使用:

~符号的含义如下:1.如果~符号后面没有用户名,则该符号代表当前用户的家目录。2。如果~符号后面跟一个用户名,则该符号代表这个用户的家目录。

history命令:

history ~ 将列出用户名最近输入过的命令、也包括输入的错误命令。history命令显示结果的最左边是命令编号、可以使用命令号重新执行所对应的命令。

bash变量简介:

shell变量是内存中一个命了名的临时存储区,shell变量中所有存储的信息有以下两种:按用户的习惯定制shell所需的信息,使用一些系统正常的变量。这些变量用户可以直接使用,如PATH变量。要提取一个变量的值,需要在变量名前冠以$符号。

大括号{}的用法:

利用大括号可以减轻工作负担。以下的touch命令将创建dog和wolf这两个新文件:touch {dog,wolf}。以下的touch命令将分别创建girl.dog,girl.wolf,boy.dog和boy.wolf这四个新文件:touch {girl.boy}.{dog.wolf}

倒引号和$符号:

没有使用倒引号或$符号之前:echo "This computer system's name is hostname" 使用倒引号之后:echo "This computer system's name is dog.super.com" 使用$符号后:echo "This computer system's name is dog.super.com."

使用Linux命令进行数学运算:

可在一行上定义多个变量、之间用分号隔开:

    year=1;year=2;year=3;year=4;year=5;

    m=99;n2=53;n3=38;n4=8;n5=2

    echo $[$n1 $n2]

    152

    [dog@dog -] [$echo $] [$year2 *n2 ]

    106

    [dog@dog - ]$ echo $[$na / $n5]

    49

    [dog@dog - ]$ echo $[$na % $n5]

反斜线()的用法:

反斜线也叫做陶艺符号,即之后的特殊字符逃脱其特殊含义而恢复原来的字面意思。没有使用反斜线之前:echo "A baby dog's price is $6839.00"  使用反斜线之后: echo "A baby dog's price is  $6839.00" A baby dog's price is $6839.00  如果将反斜线放在命令行最后,就表示它是一个续行符号,即命令要在下一行继续。Linux中命令行中引号的用法:在命令中使用单引号(')和双引号(")之间的区别如下:单引号~禁止所有的命令行扩展功能。双引号 ~ 禁止所有的命令行扩展功能但以下特殊符号除外:美元符号($),倒引号('),反斜线(),惊叹号(!)。

2.Shell编程

grep:

global/regular expression/print的缩写,grep能够在一个或多个文件内容内搜索某一特定字符模式、也被称为正则表达式。一个模式可以是一个单一的字符、一个字符串、一个单词或一个句子。一个正则表达式是描述一组字符串的一个模式。正则表达式的构成是描述一组字符串的一个模式。正则表达式的构成是模仿了数学表达式,通过使用操作符将较小的表达式组合是一个新的表达式。一个正则表达式既可以是一些纯文本文字,也可以是用来产生模式的一些特殊字符。将Linux和shell命令放入一个正文文件、这个文件就是所谓的shell脚本文件,将“ls -1F /boot | awk -f script1” 存入boot_size文件,echo "ls -1F /boot |awk -f script" > boot_size。使用bash运行脚本boot_size

$ bash boot_size

/boot directory has a total of 5628378 bytes used across 13 files.

正则表达式的通配符:

    grep支持以下正则表达式的元字(通配)符:

        c*:将匹配0个(即空白)或多个字符

        .:将匹配任何一个字符而且只能是一个字符

        [xyz]:将匹配方括号中的任意一个字符

        [^xyz]:将匹配不包括方括号中的字符的所有字符

        ^:锁定行的开头

        $:锁定行的结尾

元字符*、 、{、|、(和)失去了原义,如果恢复其原义要在之前冠以反斜线 ------ 即*、 、|、(、和)

grep命令的语法格式:

grep  选项  模式  文件名

grep命令中常用的选项如下:

    -c:仅列出包含模式的行数

    -i:忽略模式中的字母大小写

    -l:列出带有匹配行的文件名

    -n:在每行的最前列出行号

    -v:列出没有匹配模式的行

    -w:把表达式作为一个完整的单字来搜寻

除了-w选项之外,其他的每个选项都可以在egrep和fgrep命令中使用

egrep命令:

    egrep的名字来自expression grep,egrep命令是grep的一个变种。它的语法格式与grep相同。但它是用来在一个或多个文件的内容中利用扩展的正则表达式的元字符搜索特定的模式。扩展的正则表达式的元字符包括了grep中使用的正则表达式元字符的同时还增加了一些额外的元字符。在egrep命令中所增加的元字符为: :匹配一个或多个前导字符、a|b匹配a或b、(RE):匹配括号中的正则表达式RE。

fgrep命令:

 fgrep是grep命令的另一个变种,fgrep的搜索速度比grep快,fgrep可以一次迅速地搜索多个模式,fgrp不能搜索任何正则表达式,fgrep将通配符当作普通字符来处理,使用-f选项从文件中读取要搜索的模式。egrep、fgrep和grep:在Red Hat Linux或Oracle Linux中,egrep和fgrep都是grep的符号连接或者别名,在调用egrep系统自动使用了-E选项,在调用fgrep时系统自动使用了-F选项。

sed命令:

sed为steam editor (流编辑器) 的缩写。使用方法为:sed [选项]...{以引号括起来的命令表达式} [输入文件]...命令表达式通用格式为: s/旧模式/新模式/标志,两个最有用的标志位分别是g和n。g是globally(全局地)的第1个字母、表示要替代每一行中所出现的全部模式。n告诉sed只替代前n行中所出现的模式。例子:删除sedtest文件中所有空行、并删除所有包含了cal字符串的行、还要讲所有的字符tie变成fox。sed '/$/d;/cal/d;s/tie/fox/g' sedtest 将每行的开始符号替换成大于符号和空格符 sed '/$d;s/^/>g' sedtest >email.sed

awk命令:

awk命令本身是一种程序设计语言,awk为Aho、Weingberger和Kernighan的缩写,awk'{commands}',cimmands为一个或多个命令。使用频率最高的两个标志应该是-f和-F:-f表示awk将从该标志之后的文件中读取指令而不是从命令行读取,-Fc表示字段之间分隔符是c而不是默认空白字符,常使用的命令(command)为print。在文件和LInux命令的结果显示中,每行信息被指定的分隔符隔成若干个字段,每个字段都被赋予一个唯一的标识符,字段l的标识符是$1,字段1的标识符是$2等,$0变量表示整个数据行。

举例:

        列出所使用Linux系统上最流行的shell:awk  -F:'{print $7}  /etc/passwd | sort | uniq -c

        在显示结果中去掉sync用户的记录行并排序:

        $ grep /bin/etc/passwd | awk -F:'{print $1" "$7}' sed ' /sync/d' | sort

        cat /bin/bash

        dog /bin/bash

NF、NR和$0变量的使用:

$NF变量将显示一行记录中有多少个字段  who | awk '{print $NF}',NF变量将显示一行记录中最后一个字段 who | awk '{print NF}',NR变量显示数据行的编号,$0变量表示整个数据行 ls -l ~/wolf |awk 'awk{print NR": " $0}'

利用awk计算文件的大小:

显示当前目录中所有文件大小的总和的同时还显示文件的总数 例:

    $ -1F /boot | awk '{totalsize = $5} END{print"/boot directory has a total of "totalsize "bytes used across "NR"files."}'

    /boot directiory has a total of 5628378 bytes used across 13 files.

    将以上大括号中的内容存入script1文件

    运行一下命令:

    $ ls -lF /boot | awk -f script1

    /boot directory has a total of 5628378 bytes uesd across 13 files

awk中的条件语句:

条件语句的关键字是if,length是Linux自带的一个程序也叫例程、其功能是取定参数的长度,两个等号==为等号,列出系统上所有用户名为3个字符的用户: awk -F '{ if (length == 3) print $0}' /etc/passwd,列出系统上所有用户名为3个字符的用户总数:

awk -F ' { if(length($1) == 3) print $0 }' /etc/passwd | wc -l

awk中的循环语句:

awk中使用频率较高的循环语句为for语句,利用for语句统计用户名所使用的字符的个数,以下是forscript文件中的内容:

{

   count[length($1)]

}

END{

         for(i=1;i<9;i )

         print"There are " count[i]" user accounts with "i" letter names."

}

利用awk命令获取用户名所使用的字符的个数:

$ awk -F: -f forscript < /etc/passwd

There are user accounts with 1 letter names.

There are 1 user accounts with 2 letter names.

There are 13 user accounts with 3 letter names.

There are 11 user accounts with 4 letter names.

......

3.Bash Shell和配置文件

Bash Shell的配置与变量

Linux(UNIX)用户可根据需要重新配置系统,最常用重新配置Bash Shell 的方法如下:利用局域变量来设定Bash Shell,通过别名和函数来设定Bash Shell,通过别名和函数来设定Bash Shell,通过set命令来设定Bash Shell,通过环境变量设定Bash Shell中其他命令和应用程序。Shell变量是内存中一个明了名的临时存储区,在其他可以存放数字或字符的等信息。

shell变零的特性及显示:

shell变量的特性如下:shell变量分为两种类型,即局部变量和环境变量,局部变量只能在当前的工作环境(shell)中使用,环境变量即可在当前shell中使用、也会传给它的所有子shell。显示shell变量名和值使用如下两个命令:使用set命令显示所有的变零,使用env命令只显示环境变量。

通过局部变量设定Shell:

通过创建shell变量或修改变量值设定shell,Linux中通常习惯用大写字母作为shell变量名,创建shell局部变量的方法:变量名=变量的值:DOG1_COLOR = black、DOG1_COLOR为shell变量名、black为变量的值。要提取shell变量中的值在变量之前冠以$符号: Echo $DOG1_COLOR,用以下组合命令列出所有DOG开始的shell变量名:set | grep DOG

Linux预定义的局部变量PS1:

PS1变量主要设置Bash提示符所显示的信息,可将一些换码序列插入到PS1变量中、它们成为提示信息的一部分、常用换码序列如下:

          d:系统当前的日期、d应该是date的第1个字母

          t:简短形式的主机名、h应该是time的第1字母

          h:简短形式的主机名、h应该是host(主机)的第1个字母

          u:当前用户名、u应该是user的第1个字母

          w:当前的工作目录、w应是working directory的第一个字母

          t:当前命令的历史编号、1为执行历史命令的第1个字符

          $:如果是普通用户显示$、而如果是root用户显示#

          l:显示shell终端设备的基本名、l应该是line的第1个字母

别名的用法及设定:

别名是Shell中命令的一种速记法、它使用户能够按照自己的需求定制和简化Linux命令。alias的语法格式:alias别名 = 命令字符串,如创建一个名为dir的别名:alias dir = 'ls -laF'。创建一个别名时要遵守如下规则:1.在等号的两边都不能有任何空格 2.如命令字符串中包含任何选项、元字符或空格,命令就必须使用单引号括起来3.在一个别名中的每一个命令必须用分号(:)隔开。 

alias命令例题和取消别名:

使用alias命令为history命令创建别名h:alias h-history,使用alias命令为rm -i创建一个名为del的别名alias del = 'rm - r'。使用不带任何参数的alias命令列出所有的别名:

$ alias

alias del = 'rm - i'

alias dir = 'ls - laF'

alias h = 'history'

取消别名命令为:unalias 别名的名字

利用set进行Shell的设置:

许多shell参数可通过set -o命令来设定,列出全部可通过set -o命令设置的参数及默认值 set -o | more 使用set命令重新设置noclobber参数的值 set -o noclobber 列出noclobber参数的当前值:

$ set -o | grep noclob

noclobber on

将局部变量转换成环境变量:

当用户创建了一个变量之后,这个变量只能在该用户目录前工作的shell环境中使用,一旦离开了当前的shell环境,该变量就失效,只有环境变量才能不仅在当期的shell环境中生效、而且还可以在它的所有子shell中生效。将自定义的变量升级成环境变量的命令:export 变量名    如export DOG1_COLOR    export DOG2_COLOR=grey

取消一个变量命令unset:

当一个变量不再需要时可使用unset命令取消:unset DOG2_COLOR。在子shell中,unset命令取消当前shell中的、而其他shell中的变量不受影响。在主(parent)shell中,unset命令不但取消了当前shell中的变量、而且也取消它的所有子shell中的变量。

Linux常用的环境变量:

在Linux系统中有许多预设的环境变量,经常使用的环境变量及操作环境的命令如下:

HOME:用户家目录的路径

PWD:用户当前的工作目录

LANG: 标识程序

TERM:用户登录终端的类型

reset:当屏幕崩溃,重新设置终端的命令(不是变量)

PATH:可执行文件(命令)搜索路径

which:定位并显示可执行文件所在路径的命令(不是变量)

SHELL:用户登录shell的路径

USER:用户的用户名

DISPLAY:X显示器的名字

Shell启动脚本和登录Shell:

为了永久地保存变量的设定,要将变量的定义和升级为环境变量测操作存入Shell启动脚本中。脚本是存放了一些Linux命令的正文文件。Shell启动脚本是在Linux启动后立即自动执行的脚本、其中包含了系统启动后需要执行的命令和系统配置。在有些UNIX或LInux书中也将启动脚本文件称为Shell初始化文件或系统配置文件。

Shell启动脚本的作用包含以下4点:

1.通过在启动脚本中设置局部变量或运行set命令来设置shell  

2.通过在启动脚本文件中建立环境变量设置其他程序  

3.在启动脚本文件中创建(启用)别名

4.在启动脚本文件中定义系统启动时要执行的程序。

Login shell 和 Non-login shell:

登陆Shell是由用户登陆的操作而触发所运行的shell、即用户登录所使用的shell。通过“su - 用户名”命令进行用户切换,这个用户使用的也是他的登录Shell ( Login shell)。非登录Shell是以其他方式启动的一个shell:使用"su用户名"命令、su命令没有使用,执行脚本,从一个shell中启动的shell。

Login shell执行的脚本和顺序:

 当一个用户登录Linux时,登录shell按如下顺序执行所需的脚本:1.执行/etc/profile启动脚本、在/etc/profile中会调用/etc/profile.d目录下的所有启动脚本。2.执行~/.bash_profile启动脚本、在~/.bash_profile启动脚本中又会调用~/.bashre启动脚本、而~/.bashrc启动脚本又将调用/etc/bashre脚本。Linux为每个用户自动创建.bash_profile和.bashrc脚本文件,这两个文件存放在用户的家目录。

/etc/profile文件:Login shell启动时确保执行启动脚本/etc/profile。在这个脚本文件中设置的一些重要变量为:

PATH:预设可执行文件或命令的搜索路径。USER:用户登录时使用的用户名。LOGNAME:其值为$USER。HOSTNAME:所使用的主机名。MAIL:存放用户电子邮件的邮箱、一个ASCII码文件、HISTSIZE:历史记录的行数、INPUTRC变量:它指向/etc/inputrc文件、该文件是一个ASCII码文件、其中存放的是针对键盘热键设置的信息。

 /etc.prpfile.d目录:在/etc/profile.d目录中存放的是一些应用程序所需的启动脚本。这些脚本包括颜色、语言、less、vim及which等命令的一些附加设置。因为在/etc/profile中使用for循环语句调用了这些脚本,所以这些脚本才能够被自动执行。这些脚本是用来设置和运行一些初始化过程的。

~/.bash_profile 和 ~/.bashrc:~/.bash_profile和~/.bashrc这两个脚本文件中主要是存放用户自己的一些设定、其中包括了用户自己定义的变量和别名。如登陆时需执行某些将把信息传送到屏幕上的指令,应该将这些指令放在~/.bash_profile文件中,而不要放在~/.bashrc文件中。/etc/bashrc脚本文件中的信息是全局性的,其中包括了一些全系统使用的函数和别名的设定,如umask的设定。

其他的一些系统文件:

环境变量的设定并不放在~/.bash_profile文件中、而是放在/etc/profile文件中。/etc/bashrc脚本文件也是存放在用户的家目录、每当用户退出时就会运行该脚本文件。~./bash_logout主要作用是用户退出系统时自动运行某些程序,如自动备份一些重要并在用户登陆后更改过的文件、及删除没有用的临时文件等。

Linux系统支持多种语言、而这些有关语言信息的变量是由/etc/sysconfig/il8n文件维护的。~/.bash_history文件存放用户使用过的命令、每个命令一行。每当用户登陆bash之后,bash就会立即将这个文件中的所有历史命令读入内存。正因为如此,一个用户才能查看到他使用过的历史命令,使用如下的命令获取历史命令的总数: $ history | wc -l

0 人点赞