




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Shell基础08榆林职业技术学院杨浩Linux系统基础与应用实践1学习目标1.熟练掌握vim编辑器的基本使用方法。2.熟练掌握Shell脚本程序基本编写规范和执行方式。3.熟悉Linux历史命令、命令补全功能、命令别名、常用快捷键、输入输出重定向、多条命令执行、管道符、通配符与特殊符号等Bash基本功能。3.熟练掌握变量的基本概念、变量类型、变量的声明与变量的引用。4.熟练掌握Shell输入输出命令以及常用的运算符号。5.熟悉环境变量配置文件的作用,熟练掌握配置文件的调用过程。本章学习目标28.1vim编辑器38.1.1vim工作模式Vim工作模式命令模式用户只能查看所编辑的文本,而不能对其进行修改插入模式用户可以编辑、修改文本内容编辑模式用户暂时离开对正文的查看和修改,执行其它命令按”Esc”键输入命令按回车键,或”Esc”键按“:”键命令模式插入模式编辑模式Linux命令提示符执行vim命令执行wq等命令按“a”、“o”或“i”键vim三种模式之间相互切换的示意图
8.1vim编辑器48.1.1vim工作模式
例8.1新建一个名为vimtest的文本文件,在文件中随意输入一些内容,并插入行号:
第一步:执行如下命令,新建vimtest文件,并进入文件的命令模式:[root@localhost~]#vimvimtest
第二步:按“a”、“o”或“i”键,切换到插入模式,并输入以下文本:Hellovim!Iambigfanofyou.
第三步:按”Esc”键退出插入模式,然后按“:”键进入编辑模式。
第四步:在编辑模式下,输入“setnu”命令,为文本加上行号,同时返回命令模式。
第五步:在命令模式下按“:”键,再次进入编辑模式,输入“wq”命令保存文本同时退出vim编辑器。这样,vimtest文本文件就生成了,用下面的命令可以查看该文件内容:[root@localhost~]#catvimtest-n1Hellovim!2Iambigfanofyou.8.1vim编辑器58.1.2vim基本命令1.插入命令
插入命令共有“a”、“A”、“i”、“I”、“o”和“O”六个,这六个命令必须在命令模式下使用,其含义和功能见表8.1。2.定位命令
在编辑大文件时,经常需要在文件中加入行号并进行快速定位,vim编辑器定位命令及功能如表8.2所示。表8.2vim定位命令的含义及功能表8.1vim插入命令的含义及功能命令含义及功能命令含义及功能a在光标所在字符后插入I在光标所在行首插入A在光标所在行尾插入o在光标所在行的下一行插入新行i在光标所在字符前插入O在光标所在行的上一行插入新行命令含义及功能运行模式setnu在文件中设置行号编辑模式setnonu在文件中取消行号编辑模式gg定位到第一行命令模式GG定位到最后一行命令模式nG定位到第n行命令模式n定位到第n行编辑模式$定位到光标所在行的行尾命令模式0定位到光标所在行的行首命令模式8.1vim编辑器68.1.2vim基本命令3.删除命令vim中的删除名可以一次删除一个字符或多个字符,也可以一次删除一行或多行,也可以一次删除指定范围的行,具体删除命令及功能如表8.3所示。4.复制、剪切和粘贴命令
vim中的复制、剪切与粘贴命令如表8.4所示。表8.4vim复制、剪切与粘贴命令的含义及功能表8.3vim删除命令的含义及功能命令含义及功能运行模式yy复制当前行命令模式nyy复制当前行以下的n行(包括当前行)命令模式dd剪切当前行命令模式ndd剪切当前行以下的n行(包括当前行)命令模式p粘贴到当前行的下一行命令模式P粘贴到当前行的上一行命令模式命令含义及功能运行模式x删除光标所在处的字符命令模式nx删除光标所在处的后n个字符命令模式dd删除光标所在行命令模式ndd删除光标所在处后n行命令模式dG删除光标所在行及至文件末尾的所有内容命令模式D删除光标所在处至行尾的所有内容命令模式n1,n2d删除n1行至n2行的所有内容编辑模式8.1vim编辑器78.1.2vim基本命令5.替换和撤销命令vim中有专门的替换和撤销命令,其功能如表8.5所示。6.字符串查找与替换命令vim中字符串替换与查找命令及其功能如表8.6所示。表8.6vim字符串查找与替换命令的含义及功能表8.5vim替换和撤销命令的含义及功能命令含义及功能运行模式r取代光标所在处的字符,先按“r”键,紧接着输入正确字符即可命令模式R从光标所在处开始替换字符,直到按下”Esc”键结束命令模式u取消上一步的操作命令模式命令含义及功能运行模式“/”+字符串查找指定的字符串命令模式n与第一条命令配合使用,查找指定字符串出现的下一个位置命令模式setic或略大小写编辑模式setnoic区分大小写编辑模式%s/old_string/new_string/g或c全文替换(命令中“g”表示在替换时不询问,“c”表示要询问确认)编辑模式n1,n2s/old_string/new_string/g或c在指定范围内全文替换(命令中“g”表示在替换时不询问,“c”表示要询问确认)编辑模式8.1vim编辑器88.1.2vim基本命令7.保存和退出命令vim中保存和退出命令及其功能如表8.7所示。8.导入命令执行结果或文件内容命令
在编辑模式下,如果某条命令有可视的执行结果,则可以将命令的执行结果导入到当前文件光标所在位置,其格式是:“r!命令”。
如果要导入文件内容,直接执行“r文件名”命令。
下面举例说明:
例8.2把当前文件系统中各分区空间使用情况追加到vimtest文件中。第一步:用vim打开vimtest文件,并把光标移动到文件末尾第二步:在编辑模式下,执行“r!df-h”命令。
也就是说,在vim的编辑模式下可以通过“r!命令”的方式来执行Linux命令。表8.7保存和退出命令的含义及功能命令含义及功能运行模式w保存修改编辑模式wnew_filename用指定文件名另存文件编辑模式wq保存并退出编辑模式ZZ保存修改并退出的快捷键编辑模式q!不保存退出编辑模式wq!保存修改并退出(当文件的所有者或root用户对文件没有写权限时,可以使用该命令强制保存并退出)编辑模式8.2Shell与Shell脚本98.2.1Shell简介Shell是Linux/Unix的一个命令行解释器,它为用户提供与系统内核进行信息交互的接口,Shell把用户输入的命令解释为内核可识别的指令进行执行,然后把执行结果经Shell解释为用户可识别符号显示出来。
Shell也是一个功能强大的编程语言,有自己的编程语法,也可以直接调用Linux/Unix系统命令,用户可以利用Shell编写成具有特定功能的Shell脚本程序。Shell的种类较多,目前Linux使用的基本Shell就是BourneShell下的bash(Linux支持的Shell都保存在/etc/shells文件中),本章我们以bash为例,介绍Shell脚本程序的设计方法。8.2Shell与Shell脚本108.2.2Shell脚本的执行方式1.编写Shell脚本的基本规范
在编写Shell脚本程序时要遵循如下基本规范:Linux系统中,文件是不需要扩展名的,但为了方便用户管理和使用,我们习惯用“.sh”作为Shell脚本文件名的后缀。在程序第一行输入“#!/bin/bash”,表示执行该Shell脚本程序时用的解释器是“/bin/bash”,当然,如果是用的其它解释器,则替换为相应的解释器即可。需要注意的是:这里的“#”不是注释,它和“!”一起用来声明该脚本程序所用的解释器。接下来用简明的语言概括所编写程序要完成的功能、编写日期、作者信息等,可以根据内容分行输入,但必须用“#”加以注释,当然这些内容不是必须的。输入程序指令,并做必要的注释。2.编写第一个Shell脚本程序
第一步:输入如下命令,进入vim编辑器:[root@localhostshelltest]#vimhelloLinux.sh
第二步:在打开的HelloLinux.sh文件中输入如下内容,并保存退出。#!/bin/bash#HelloLinux!#author:yh#date:2018.8.10echo'helloLinux!'
这样,就创建了第一Shell脚本程序文件HelloLinux.sh,该程序的解释器是/bin/bash,程序名称是“HelloLinux!”,作者是yh,编写日期是2018.8.10,程序功能是向屏幕输出“HelloLinux!”。8.2Shell与Shell脚本118.2.2Shell脚本的执行方式3.Shell脚本的执行方式Shell脚本的执行方式有两种,可以通过bash命令来执行,也可以赋予用户执行权限,直接运行相应的Shell脚本。通过bash命令调用执行,其格式是:bash脚本程序名,如:[root@localhost/]#bash/tmp/shelltest/helloLinux.shhelloLinux!赋予执行权限,直接执行,如:[root@localhost/]#chmod755/tmp/shelltest/helloLinux.sh[root@localhost/]#/tmp/shelltest/helloLinux.shHelloLinux!
4.DOS脚本与Unix脚本的相互转换Windows下编写的Shell脚本往往不能再Linux系统下正常执行,其原因之一是有些不可见的字符,如回车符,在Linux与Windows之间不相互兼容,在运行脚本时,往往会出现类似“-bash:./helloLinux.sh:/bin/bash^Mbadinterpreter”这样的提示信息,这时需要将DOS格式的脚本转换为Unix格式的脚本,可以有两种方法实现脚本转换:利用dos2Unix命令,如:[root@localhostshelltest]#dos2unix./helloLinux.shdos2unix:convertingfile./helloLinux.shtoUNIXformat...#转换成了Unix格式的脚本
当然,也可以用unix2dos命令把Unix格式Shell脚本转换为DOS格式的Shell脚本。在vim编辑器的编辑模式下,输入:“setff=unix”或“setff=dos”命令,进行格式转换。8.3Bash基本功能128.3.1Linux历史命令和命令补全Linux中,每个用户的家目录下都有一个隐藏文件.bash_history,该文件自动保存用户使用过的所有历史命令,系统默认最多保存1000条,这个值可以通过编辑环境变量配置文件/etc/profile的相关条目来修改,当命令条数超过最大值1000时,淘汰最先使用过的命令。下面介绍对历史命令的查看、保存和利用
任何用户都可以执行history命令,来查看自己的历史命令,也可以手动将使用过的命令写入自己的.bash_history文件或其它文件。
1.查看、清除历史命令history命令用来查看、清除自己的历史命令。
命令格式:[root@localhost~]#history[选项][参数]
参数说明:N表示第N条历史命令,缺省参数表示全部命令。
选项说明:c表示清除全部历史命令。d与参数N配合使用,表示清除第N条历史命令。缺省选项,时用于查看历史命令。
例8.3可用如下命令查询历史命令中的第10条命令:[root@localhost~]#history10
例8.4可用如下命令删除历史命令中的第100条命令:[root@localhost~]#history-d100
8.3Bash基本功能138.3.1Linux历史命令和命令补全2.保存历史命令history命令的另一个功能是将历史命令保存到.bash_history或指定文件。
命令格式:[root@localhost~]#history[-a|-w][文件名]
选项说明:a表示只保存相对于.bash_history文件的新增命令。w表示保存.bash_history文件中的已有命令和新增命令。Linux并不会立即把执行过的命令保存到.bash_history文件中,可以使用该命令来把执行过的命令保存到指定文件中,默认保存到.bash_history文件。
3.调用历史命令
有些命令书写起来较复杂,这时可以调用历史命令。
(1)!!命令用来重复执行前一条命令。
命令格式:[root@localhost~]#!!
(2)!String命令调用最近执行过的以String字符串开头的命令。
命令格式:[root@localhost~]#!String
如要执行最近执行过的以“ls”字符串开头的命令,可执行如下命令:[root@localhost~]#!ls
(3)!N命令用来执行历史命令中的第N条命令。
如要调用第100条命令,可执行如下命令:[root@localhost~]#!100
8.3Bash基本功能148.3.1Linux历史命令和命令补全4.命令和文件补全
在输入命令或文件、目录时,可以利用Tab键的补全功能将命令或文件、目录名称补充完整。
如,当用户输入“his”字符串后,再按Tab键,这时如果以“his”开头的命令具有唯一性,则会把该命令补全,如“history”,如果以“his”开头的命令不唯一,则再按Tab键,系统会列出以“his”开头的所有命令。
Tab键对于文件和目录也具有类似的功能,使用Tab键的补全功能,可以为命令、文件的输入提供极大方便。
命令别名,就是为长命令或复杂命令定义一个较简单的名称,通过执行别名来达到与执行原命令同样的效果。1.命令别名
查看已定义的别名使用如下命令格式:[root@localhost~]#alias
定义命令别名使用如下命令格式:[root@localhost~]#alias命令别名=’原命令’
例8.5可用如下命令为命令“yum–yinstall”定义别名为“yum”:[root@localhost~]#aliasyum='yum-yinstall'
这样,命令yumunix2dos的功能就相当于执行命令yum–yinstallunix2dos。如:[root@localhost~]#yumunix2dos
8.3.2命令别名和快捷键8.3Bash基本功能158.3.3输入输出重定向
删除命令别名使用如下命令格式:[root@localhost~]#unalias别名
当然也可以通过编辑用户的.bashrc文件来删除。
使用命令别名需要注意的事项:
定义新的别名时,要慎重为命令别名命名,避免新定义的别名把原来命令的功能覆盖了。
当有名称相同的命令和命令别名时,优先执行顺序如下:首先是带路径的命令、其次是命令别名,再次是Bash内部命令,然后是$PATH环境变量中定义的第一个名称相同的命令。
通过命令行定义的命令别名只能临时生效,要永久生效,就需要将命令别名的定义写入.bashrc文件。每个用户都有一个.bashrc文件,在自己的家目录下,如:root用户的.bashrc是/root/.bashrc
2.Bash常用的快捷键Bash中常用的快捷键及功能如表8.8所示:
转义控制字符功能描述Ctrl+A把光标移动到命令行开头Ctrl+E把光标移动到命令行末尾Ctrl+C强制终止当前命令Ctrl+L清屏,相当于clear命令Ctrl+U删除或剪切光标之前的命令Ctrl+K删除或剪切光标之后的命令Ctrl+Y粘贴剪贴中的内容Ctrl+R调出搜索界面,在历史命令中搜索相关命令Ctrl+D退出当前终端Ctrl+Z将当前命令(任务)放入后台执行Ctrl+S暂停屏幕输出Ctrl+Q恢复屏幕输出8.3Bash基本功能168.3.3输入输出重定向1.标准输入输出
计算机系统的输入输出设备很多,但在Linux系统中,我们只把键盘作为标准输入设备,其设备文件名是/dev/stdin,文件描述符是0,把显示器作为标准的输出设备,其设备文件名是/dev/stdout,文件描述符为1,同时把显示器也当作标准错误输出设备,文件名是/dev/stderr,文件描述符是2。
如果我们要用到非标准输入输出设备时,就需要使用Linux提供的输入输出重定向功能。2.输出重定向
输出重定向就是将命令的执行结果重定向到文件或其它非标准输出设备。输出重定向包括标准输出重定向和标准错误输出重定向。
标准输出重定向命令格式[root@localhost~]#命令[>|>>]文件
把命令的执行结果以覆盖(>)或追加(>>)的方式输出到指定的文件或设备。
标准错误输出重定向命令格式[root@localhost~]#错误命令[2>|2>>]文件
把命令的错误执行结果以覆盖(2>)或追加(2>>)的方式输出的指定到文件或设备。8.3Bash基本功能178.3.3输入输出重定向
例8.6可用如下命令将catls–l命令的输出结果以覆盖的方式输出到redirect_test.txt文件:[root@localhosttemp]#ls-l>redirect_test.txt[root@localhosttemp]#catredirect_test.txt执行结果:总用量4-rw-r--r--.1rootroot07月202:08c-rw-r--r--.1rootroot08月1109:44redirect_test.txtdrwxrwxr-x.2yhyh40967月209:31umask
例8.7可用如下命令将date命令的执行结果追加到redirect_test.txt文件:[root@localhosttemp]#date>>redirect_test.txt[root@localhosttemp]#catredirect_test.txt执行结果:总用量4-rw-r--r--.1rootroot07月202:08c-rw-r--r--.1rootroot08月1109:44redirect_test.txtdrwxrwxr-x.2yhyh40967月209:31umask2018年08月11日星期六09:46:18CST
如果命令书写错误,系统会提示“找不到该命令”等信息。如:[root@localhosttemp]#data#误将命令“date”写成了“data”bash:data:commandnotfound#错误输出直接输出到标准输出设备——显示器
有时,我们需要将错误命令产生的提示信息写入到指定的文件。8.3Bash基本功能188.3.3输入输出重定向
例8.8可用如下命令将错误的执行结果以覆盖的方式输出到redirect_test.txt文件:[root@localhosttemp]#data2>redirect_test.txt#输出到文件后,不再在屏幕显示[root@localhosttemp]#catredirect_test.txt#错误输出覆盖了文件中原有的内容bash:data:commandnotfound
而在实际中,我们不一定能预测到某条命令是否能正确执行,所以需要一种两全其美的方法,不管命令能否正确执行,都能将其结果保存下来。
将命令的正确执行结果或错误执行结果都保存在同一个文件中。
命令格式:[root@localhost~]#命令[&>|&>>]文件
不管命令是否正确执行,将其执行结果以覆盖(&>)或追加(&>>)的方式输出到指定的文件或设备。
将命令的正确执行结果和错误执行结果分别保存在不同的文件中。
命令格式:[root@localhost~]#命令[>|>>]文件1[2>|2>>]文件2
把命令的正确执行结果以覆盖(>)或追加(>>)的方式输出到文件1,如果执行错误,则以覆盖(>)或追加(>>)的方式输出到文件2。
这种情况一般用追加的方式输出,如果用覆盖的方式,不管输出到哪个文件,都同时先清空两个文件。然后再向相应文件输出。8.3Bash基本功能198.3.3输入输出重定向
例8.9无论命令能否正确执行,都将其执行结果追加到redirect_test.txt:
执行如下命令,将正确命令“ls-l”的执行结果追加到redirect_test.txt:[root@localhosttemp]#ls-l&>>redirect_test.txt
执行如下命令,将错误命令“lsss-l”的执行结果追加到redirect_test.txt:[root@localhosttemp]#lsss-l&>>redirect_test.txt#专设错误命令“lsss”,以供实验[root@localhosttemp]#catredirect_test.txt
显示结果为:bash:data:commandnotfound总用量8-rw-r--r--.1rootroot07月202:08c-rw-r--r--.1rootroot308月1109:50redirect_test.txtdrwxrwxr-x.2yhyh40967月209:31umaskbash:lsss:commandnotfound
结果解释:redirect_test.txt中共有6行文本,第1行是文件原有的内容,第2~5行是正确执行结果,第6行是错误执行结果。
例8.10可用如下命令将命令的正确执行结果追加到redirect_test.txt1,错误执行结果追加到redirect_test.txt2文件:[root@localhosttemp]#ls-l>>redirect_test.txt12>>redirect_test.txt23.输入重定向
输入重定向,是指输入不是来源于标准的输入设备(如键盘),而是来源于文件或非标准输入设备。输入重定向在实际中用的很少,这里举例说明输入重定向的简单用法。
例8.11统计redirect_test.txt文件中的单词数。
下列命令将输入重定向到了redir_test.txt,将该文件的内容作为命令“wc–w”的输入:[root@localhosttemp]#wc-w<redirect_test.txt39
得知,redirect_test.txt文件共有39个单词。8.3Bash基本功能208.3.4多命令执行与管道符1.多命令执行Bash支持的多命令执行,主要有如下三种情况:顺序执行所有命令。
把需要执行的多条命用“;”号连接起来,系统就会顺序执行各条命令,不管前面的命令能否正确执行,所有的命令都会执行。
例8.12下面四条命令ls-l、date、cd/user和pwd可以顺序执行:[root@localhosttemp]#ls-l;date;cd/user;pwd
结果分析:这四条命令会顺序执行,由于没有/user目录,所以cd/user命令不能正确执行,但不影响其后pwd命令的执行。顺序执行所有命令,直到错误命令。
用“&&”连接的n条命令中,只有前面的命令都正确执行了,才会执行下一条命令,若某一条命令不能正确执行,则其后的命令都停止执行。
例8.13下面四条命令ls、pwd、cd/user和cat/etc/passwd执行过程中,若某条命令不能正确执行,则其后所有命令停止执行。[root@localhosttemp]#ls&&pwd&&cd/user&&cat/etc/passwd
结果分析:ls命令可以正确执行,所以pwd命令就可以执行,同理,cd/user命令就可以执行,但由于该命令不能正确执行,所以其后的cat/etc/passwd命令停止执行。8.3Bash基本功能218.3.4多命令执行与管道符1.多命令执行顺序执行第一条正确命令
用“||”连接的n条命令中,只有前面的命令都不能正确执行时,才会执行下一条命令,当某条命令正确执行后,则其后的所有命令不管能否正确执行,都不执行。
例8.14下面四条命令ls–ld/user、cd/user、pwd和cat/etc/passwd顺序执行第一条正确命令:[root@localhosttemp]#ls-ld/user||cd/user||pwd||cat/etc/passwd
结果分析:第一条命令中由于不存在目录/user,不能正确执行,所以顺序执行第二条命令,同理,第二条命令也不能正确执行,所以顺序执行第三条命令,由于第三条命令可以正确执行,所以即使其后的命令可以正确执行,也不再执行了。
例8.15把硬盘/dev/sdb的全部数据拷贝到硬盘/dev/sda中,计算所用时间:
第一步:执行如下命令,将/dev/sdb的全部数据拷贝到硬盘/dev/sda,并记录开始时间和结束时间:[root@localhosttemp]#date;ddif=/dev/sdbof=/dev/sda;date
第二步:用结束时间减去开始时间就是所用时间(具体计算略)。
对磁盘拷贝命令做如下说明:
命令格式:[root@localhost~]#ddif=输入文件(来源文件)of=输出文件(目标文件)
bs=每个数据块的字节数count=数据块数
该命令主要用于磁盘之间的拷贝,当然也可以用于文件之间的非全文拷贝。8.3Bash基本功能228.3.4多命令执行与管道符1.多命令执行
例8.16可用如下命令将redirect_test.txt文件中的前30个字节拷贝到redirect_test.txt2文件:[root@localhosttemp]#ddif=redirect_test.txtof=redirect_test.txt2bs=2count=15
执行结果为:记录了15+0的读入记录了15+0的写出30字节(30B)已复制,0.000182272秒,165kB/秒
例8.17在Shell编程中,可用如下指令判断cd命令能否正确执行:[root@localhostusr]#cd/usr&&echo执行正确!||echo执行错误!执行结果:执行正确![root@localhostusr]#cd/user&&echo执行正确!||echo执行错误!执行结果:bash:cd:/user:没有那个文件或目录执行错误!
注意:符号“&&”与“||”的顺序不能互换!
2.管道符
管道符用“|”符号来表示,管道符连接的两条命令中,前一条命令的执行结果作为后一条命令的操作对象,所以前一条命令必须要有正确的输出结果。其命令格式是:[root@localhost~]#命令1|命令2|命令3…|命令n
例8.18可用如下命令分屏显示/etc/services文件中含“/tcp”字符串的条目:[root@localhost~]#cat/etc/services|grep/tcp|more
上述命令中命令cat/etc/services的执行结果,作为命令grep/tcp操作对象,来查找包含“/tcp”的条目,命令grep/tcp执行结果又作为命令more的操作对象,进行分屏显示。8.3Bash基本功能238.3.5通配符与特殊符号1.通配符Bash支持功能强大的通配符,常用的通配符及其含义如表8.9所示。
下面举例说明通配符的用处:
例8.19可用如下命令删除/tmp/temp目录下的所有文件:[root@localhosttemp]#cd/tmp/temp/[root@localhosttemp]#rm-fr*#删除当前目录下的所有文件,谨慎使用该命令!
例8.20可用如下命令显示/tmp目录下的所有以数字字符开头的文件:[root@localhosttmp]#ls-l[1-9]*表8.9通配符及其含义通配符含义?匹配任意一个字符。*匹配0个或任意多个任意字符。[]匹配中括号中的任意一个字符,如[abc]可以与a匹配,也可以与b匹配,还可以与c匹配。[起始字符-结束字符]匹配起始字符与结束字符之间的任何一个字符,如[A-Z]代表任何一个大写字母。[^起始字符-结束字符]取反,表示除了中括号内的任何字符,如[^0-9]代表任意一个非数字字符.8.3Bash基本功能248.3.5通配符与特殊符号2.特殊符号Shell脚本设计常用的特殊符号如表8.10所示。
例8.20在屏幕原文输出“Kindnessisthemostbeautifulquality”:[root@localhost~]#echo'Kindessisthemostbeautifulquality'
执行结果:Kindessisthemostbeautifulquality
因为原文输出的内容包含了空格符号,所以必须使用引号引起来,如果是单个单词或没有空格,则可以不使用引号。8.21先定义一个变量,同时赋初值“yh”,然后将其值输出到屏幕:[root@localhost~]#name=yh#定义变量name,并赋予值“yh”[root@localhost~]#echo$name#输出变量mame的值,“$”表示变量取name的值yh[root@localhost~]#echo"mynameis$name"#双引号内的特殊符号“$”仍然有效mynameisyh[root@localhost~]#echo'mynameis$name'#单引号内的特殊符号全部失效mynameis$name表8.10特殊符号及其含义符号含义‘’单引号,原文输出引号内的内容,引号内,特殊符号的功能都失效。“”双引号,原文输出引号内的内容,引号内,除“$”、“`”和“\”三个符号保留特殊符号的含义外,其它特殊符号的功能都失效。``反引号,反引号内的内容是系统命令,在Bash中优先执行,与$()作用相同,推荐使用$()。$()与反引号作用相同,引用系统命令的执行结果。如:[root@localhost~]#echo$(date)2018年08月12日星期日08:36:09CST#Shell脚本中的行注释符号。$引用变量的值,如$ID的作用是引用变量ID的值。\转义符,使其后的字符失去特殊含义而变成普通字符输出。8.4Bash命令258.4.1变量的基本概念1.变量类型Bash中,根据变量的作用不同,可以分为四种变量:用户自定义变量:由用户根据需要定义,用户可以随时修改变量的值。自定义变量的作用域是当前Shell。环境变量:保存与系统运行环境相关的数据,用户也可以自定义环境变量,也可以调整环境变量的值来实现相应的功能。环境变量的作用域是当前Shell及其子Shell,如果把环境变量写入相应的配置文件,那么,它的作用域是所有Shell。位置参数变量:这种变量的作用是固定的,由系统定义,主要用来向脚本传递相关值。
预定义变量:Bash预先定义好的变量,有固定的作用,不能由用户定义。2.父Shell与子Shell
父Shell与子Shell是相对的,如果把当前Shell作为父Shell,则在命令行输入相应的Shell名称就能进入对应的子Shell,用pstree命令可以查看当前所处的Shell。如:[root@localhost~]#csh#进入子Shell——Csh[root@localhost~]#bash#进入子Shell——Bash[root@localhost~]#pstree#查看所在Shell
输出结果:├─sshd───sshd───bash───csh───bash───pstree
第一个bash是执行命令前的Shell,即当前Shell,执行名csh后进入子Shell——Csh,执行命令bash后,进入下一级Shell——Bash。以“csh”为参照,前一个“bash”是它的父Shell,后一个“bash”是它的子Shell。要退出当前Shell,执行exit命令即可,退出Shell时,在当前Shell声明的所有变量都将被清空,除非将其写入配置文件。8.4Bash命令268.4.1变量的基本概念3.变量命名规则
像其它编程语言一样,Bash变量的命名也要遵循相应的规则:Bash变量名只能包含字母、数字和下划线,但不能以数字开头;Bash变量的默认类型都是字符串类型,如果需要进行算术运行,则需要设定其为数值类型;自定义变量习惯于用小写字母,环境变量变量用大写字母。2.变量赋值
可以为定义好的变量重新赋值,变量重新赋值与变量定义的格式完全相同。如:system=Unix,就是把变量system的值重新赋值为“Unix”。变量值如果有空格,则需要使用单引号或双引号将其括起来,如:department=”Qualitymanagement”
表示变量department的值是“Qualitymanagement”。
也可以把一个变量的值赋予另一个变量,或把某条命令的执行结果赋值给变量。3.变量引用
由前述所知,引用变量的值,要在变量名前加“$”,引用命令的执行结果要使用“$(命令名)”格式。如:system1=$system,表示把变量system的值赋值给了变量system1;result=$(date),表示把命令date的执行结果赋值给了变量result。8.4.2用户自定义变量1.声明自定义变量
变量首次被赋值的同时,被声明,其格式是:变量名=变量值变量名与变量值用“=”链接,“=”两侧不能有空格。
如:system=Linux,就是定义一个名为system的变量,并设置变量的初始值为“Linux”,这样,变量system就定义好了。8.4Bash命令278.4.2用户自定义变量4.连接字符串
连接两个字符串变量的格式为:$变量1$变量2
链接字符串变量与字符串常量的格式为:“$变量”常量或常量“$变量”或
${变量}常量或常量${变量}5.查看变量[root@localhost~]#set
查看系统中保存的所有变量6.删除变量[root@localhost~]#unset变量名
删除指定变量1.声明环境变量
用户自己可以声明环境变量,格式为:export变量名=变量值
其中,export是声明环境变量的关键字。
如:exportBIRTHDAY=2018年8月14日,
声明BIRTHDAY是环境变量,其初始值是2018年8月14日。
声明环境变量也可以先给变量赋值,然后将其声明为环境变量。如:[root@localhost~]#AGE=18[root@localhost~]#exportAGE
这样,环境变量BIRTHDAY和AGE,不仅在当前Shell中生效,而且还在其子Shell中生效,但不能在父Shell中生效。为了使环境变量能在所有Shell中长期生效,可以把环境变量的声明写入用户的配置文件中,如root的配置文件是/root/.bashrc,然后重启系统即可。8.4.3环境变量8.4Bash命令288.4.3环境变量2.查看和删除环境变量
set命令可以查看所有变量,env命令专门用于查看系统变量。删除系统变量的方法类似于删除用户自定义变量,可使用unset命令,如删除AGE系统变量,可以使用如下命令:[root@localhost~]#unsetAGE
环境变量的赋值、引用与自定义变量相同,这里不再赘述。3.常用的系统自定义环境变量
用env命令可以查看到系统全部的环境变量,下面介绍几个常用的环境变量。系统查找命令的路径:PATH环境变量
系统在执行命令时,并不需要我们输入命令所在的路径,而是直接在命令行输入命令本身即可。原因就是所有命令的路径都保存在PATH环境变量中。PATH环境变量的值是用“:”分割的一串路径,系统执行命令时,搜索PATH环境变量保存的路径从而找到命令所对应的命令文件。
执行如下命令,可以查看PATH环境变量的值:[root@localhost~]#echo$PATH执行结果:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/binls命令的绝对路径是/bin/ls,当我们在命令行输入ls,按回车键后,系统就在PATH环境变量中搜索ls命令文件所在的路径/bin,并在/bin目录下找到ls命令文件才开始执行,所以执行ls命令与执行/bin/ls命令是等效的。如果PATH中删除命令ls的路径/bin,则必须在命令行中输入/bin/ls才能正确执行ls命令。/home/remounttest.sh是用户自己编写Shell脚本文件,要想在任何目录提示符下输入文件名remounttest.sh就能执行该脚本,必须把它的目录/home添加到PATH环境变量中:[root@localhosthome]#PATH="$PATH":/home#把/home加入PATH变量,用“:”分割8.4Bash命令298.4.3环境变量2.查看和删除环境变量[root@localhosthome]#echo$PATH/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/home
#/home目录已加入到PATH变量[root@localhosthome]#cd/root[root@localhost~]#remounttext.sh#可以直接输入文件名执行程序Linuxisagreatoperatingsystem!
但是,这种方式也是临时生效,要永久生效,需要将命令"$PATH":/home写入/etc/profile配置文件。定义系统提示符:PS1环境变量
环境变量PS1,定义了系统命令行提示符的格式,执行如下命令,查看当前提示符格式:[root@localhost~]#echo$PS1[\u@\h\W]\$
说明系统当前提示符格式是“[\u@\h\W]\$”8.4Bash命令308.4.3环境变量
那么各参数代表什么含义呢?环境变量PS1中各参数的含义见表8.11。
所以系统当前提示符格式是“[用户名@主机名最后一个目录]提示符”。
例8.22可用如下命令定义命令提示符的格式为“[用户名@12小时制时间绝对路径]提示符”:oot@localhost~]#PS1='[\u@\t\w]\$'[root@03:38:32~]#cd/tmp/temp[root@03:38:53/tmp/temp]#
同样,上述修改也只是临时生效,要长期生效,需要把修改写入相应的配置文件,不过我们习惯使用系统默认的提示符格式。参数名称含义\d显示日期,格式为:星期月日\h显示主机名,默认主机名是locatehost\t以24小时制显示时间,格式为HH:MM:SS\T以12小时制显示时间,格式为HH:MM:SS\A以24小时制显示时间,格式为HH:MM\u显示当前用户\w显示当前绝对目录\W显示当前绝对目录的最后一个目录\#执行的第几条命令\$命令提示符,root用户的提示符为“#”,普通用户的提示符为“$”8.4Bash命令318.4.4位置参数变量
系统中的位置参数变量及其作用都是固定的,用户不能自己定义位置参数变量,只能借助位置参数变量进行参数传递。位置参数变量及其作用如下表所示。
例8.23编写一个加法计算器,求任意两个数的和。
第一步:新建一个Shell脚本文件calculator.sh,将以下内容写入脚本,并保存:#!/bin/bash#求和计算器#作者:yhecho"程序文件名为:"$0sum=$(($1+$2))echo"sum="$sum
第二步:#运行程序,并把100和200两个数传递给位置参数变量$1和$2:[root@localhosttemp]#./calculator.sh100200
运行结果:
程序文件名为:./calculator.sh
sum=300
本例说明:系统把命令行的程序文件名“./calculator.sh”传递给了位置参数变量$0,把“100”和“200”两个参数分别传递给了位置参数变量$1和$2。位置参数变量含义$nn为非负整数,其中$0表示当前运行的程序本身,$n表示第n个参数(1<=n<10),当n>=10时,要用大括号括起来,如${10}。$*表示命令行中的所有参数,它把所有的参数作为一个整体。$@表示命令行中的所有参数,不过它区别对待各个参数$#表示命令行中所有参数的个数8.4Bash命令328.4.4位置参数变量
例8.24编写一个Shell脚本,输出用户终端输入的参数个数,并分别打印$*和$@的值。
第一步:新建一个Shell脚本文件paratest.sh,将以下内容写入脚本,并保存:#!/bin/bashecho"参数个数为:"$#foriin"$*"doecho'位置参数变量$*的值为:'$idonex=1forjin"$@"doecho'位置参数变量$@的第'$x'个参数的值为:'$jx=$(($x+1))done
第二步:执行程序并设置参数[root@localhosttemp]#./paratest.shyouIhe
运行结果为:参数个数为:3位置参数变量$*的值为:youIhe位置参数变量$@的第1个参数的值为:you位置参数变量$@的第2个参数的值为:I位置参数变量$@的第3个参数的值为:he
由此可知,位置参数变量$#的值是用户输入的参数个数,位置参数变量$*和$@的值都是用户输入的参数,但是$*把用户输入的所有参数作为一个整体,而$@把用户输入的所有参数分别对待。8.4Bash命令338.4.5预定义变量
Bash中,主要有$?、$$和$!三个预定义变量,预定义变量的作用类似于位置参数变量,其含义如下表所示。位置参数变量含义$?其值是上一条命令的执行状态。如果上一条命令执行正确,其值为0,如果执行错误,则结果为非零数字。$$其值为当前进程的ID号(PID)。$!其值为后台运行的最后一个进程的ID号,如果没有后台进程,则返回空。8.5输入输出命令348.5.1键盘输入命令
read命令是bash内部命令,其作用是接收键盘输入到指定的变量。
命令格式:[root@localhost~]#read[选项][变量名]
选项说明:p“提示信息”,用户定义的输入提示信息。t指定等待用户输入的时间,单位是秒,如果在指定时间内没有输
入,则跳到下一步,默认为一直等待。n定义允许输入的最大字符个数。s隐藏输入的数据,如密码等机密数据的输入需要隐藏。
例8.25编写一个Shell脚本,求位数不大于2的两个数的和。
第一步:新建一个Shell脚本程序,输入如下内容并保存退出。#!/bin/bash#求两个数的和:read-p"请输入第一个加数(两位数,5秒内):"-t5-n2num1echo–e“\n”read-p"请输入第二个加数(两位数,5秒内):"-t5-n2num2echo–e“\n”sum=$(($num1+$num2))echo"两个数的和为:"$sum
第二步:赋予权限,执行程序,验证程序的正确性。[root@localhosttemp]#chmod755calculator_friendly.sh[root@localhosttemp]#./calculator_friendly.sh请输入第一个加数(两位数,5秒内):23请输入第二个加数(两位数,5秒内):54两个数的和为:778.5输入输出命令358.5.2输出命令echoecho命令所在目录是/bin,所有用户都可以执行,其功能是向屏幕输出文本。
命令格式:[root@localhost~]#echo[选项]输出文本
该命令的常用选项是e,它支持转义控制字符,控制文本输出格式。使用该选项时,其后的输出文本要用双引号或单引号。该选项所支持的转义控制字符及其功能如右表所示
例8.26可用如下命令顺序输出a~j十个字母,每行五个,字母之间用制表符分割:[root@localhost~]#echo-e"\ta\tb\tc\td\te\n\tf\tg\th\ti\tj"
输出结果:abcdefghij转义控制字符功能描述\\输出“\”\a输出警告音\b输出退格键,即向左删除一个字符\c取消输出行末尾的换行符\e输出ESCAPE键\f换页符\n换行符\r回车键\t输出水平制表符\v输出垂直制表符\0nnn按照八进制ASCll码表输出字符。其中的“nnn”为三位八进制数\xhh按照十六进制ASCII码表输出字符,其中的“hh”为两位十六进制数8.6运算符368.6.1声明和取消变量类型
未特别声明变量类型的情况下,变量的默认类型是字符串类型。如:[root@localhosttemp]#num1=5[root@localhosttemp]#num2=4[root@localhosttemp]#str=$num1+$num2#变量str的默认类型是字符串类型,所以等于号右侧执行字符串连接操作[root@localhosttemp]#echo$str5+4
另外,declare命令在声明变量的同时,可以为变量赋值。
例8.26可用如下命令声明一个整型环境变量var,同时赋初值22:[root@localhosttemp]#declare-i-xvar=22#声明变量[root@localhosttemp]#declare-pvar#查看变量类型和值执行结果:declare-ixvar="22"#变量var的类型为整型环境变量(-ix),其值为22
declare命令是Bash内部命令,其作用是声明或取消环境变量类型,也可以查看变量的类型和值。若不带任何选项和参数时,显示所有Shell变量及它们的值,此时,相当于不带参数选项的命令set和typeset的作用。
命令格式:[root@localhost~]#declare[-i|+i|+x|-x|-r|-p][变量名]
选项说明:-i或+i声明指定变量的类型为整型变量,或取消指定变量的整型类型。-x或+x声明指定变量的类型为环境变量,或取消指定变量的环境类型属性。该选项在声明变量类型时,作用相对于export命令声明的环境变量。-r声明指定变量为只读变量,变量的只读属性不能被取消,也不能删除该变量。-p查看指定变量的类型和值,不带变量名时,显示所有变量的类型和值。8.6运算符378.6.2算术运算方法2.使用expr命令进行算术运算expr命令可以进行算术运算也可以进行字符串运算,若操作数与操作符之间有空格符分割,则执行算术运算,若无空格分割,则执行字符串连接操作,此时将操作符当作字符串常量。如:[root@localhosttemp]#expr$num1+$num2#无空格符分割执行结果:5+4[root@localhosttemp]#expr$num1+$num2#有空格分割
执行结果:9用expr命令计算例8.27的方法如下:[root@localhosttemp]#sum=$(expr$num1+$num2)#将命令expr的执行结果赋值给sum[root@localhosttemp]#echo$sum91.用declare将存储算术运算结果的变量声明为整型变量,然后进
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025至2030年中国清水竹笋数据监测研究报告
- 2025至2030年中国桃红色料数据监测研究报告
- 厕所维修合同范本
- 敦煌悬泉汉简中的置所马政及其相关问题研究
- 合伙开大货车合同范本
- 使用优惠活动促进销售增长
- 买卖合同范例中
- 熔盐电解提取-分离典型裂片元素(Zr、Ce、Nd)及燃料元素(Th)的研究
- 2025至2030年中国实木酒柜数据监测研究报告
- 合作租赁土地合同范本
- 现场物资安全管理
- 蔬菜种植基地管理手册
- 2024解析:第二十章电与磁-讲核心(解析版)
- 2023年会计基础各章节习题及答案
- 《中小学教师人工智能素养框架与实践路径研究》专题讲座
- DB4101T 25.2-2021 物业服务规范 第2部分:住宅
- 舞台设计课件教学课件
- 六年级数学下册 负数练习题(人教版)
- 2024-2030年中国康复医院行业管理模式分析及发展规划研究报告
- 斐讯PSG1218路由器的上网设置教程
- 重大事故隐患判定标准
评论
0/150
提交评论