1、Shell基础08榆林职业技术学院 杨浩与应用实践1学习目标1.熟练掌握vim编辑器的基本使用方法。2.熟练掌握Shell脚本程序基本编写规范和执行方式。3.熟悉Linux历史命令、命令补全功能、命令别名、常用快捷键、输入输出重定向、多条命令执行、管道符、通配符与特殊符号等Bash基本功能。3.熟练掌握变量的基本概念、变量类型、变量的声明与变量的引用。4.熟练掌握Shell输入输出命令以及常用的运算符号。5.熟悉环境变量配置文件的作用,熟练掌握配置文件的调用过程。本章学习目标28.1 vim编辑器38.1.1 vim工作模式Vim工作模式命令模式用户只能查看所编辑的文本,而不能对其进行修改插入
2、模式用户可以编辑、修改文本内容编辑模式用户暂时离开对正文的查看和修改,执行其它命令按”Esc”键输入命令按回车键,或”Esc”键按“:”键命令模式插入模式编辑模式Linux命令提示符执行vim命令执行wq等命令按“a”、“o”或“i”键vim三种模式之间相互切换的示意图8.1 vim编辑器48.1.1 vim工作模式 例8.1 新建一个名为vimtest的文本文件,在文件中随意输入一些内容,并插入行号:第一步:执行如下命令,新建vimtest文件,并进入文件的命令模式:rootlocalhost#vim vimtest 第二步:按“a”、“o”或“i”键,切换到插入模式,并输入以下文本:Hel
3、lovim!Iambigfanofyou.第三步:按”Esc”键退出插入模式,然后按“:”键进入编辑模式。第四步:在编辑模式下,输入“setnu”命令,为文本加上行号,同时返回命令模式。第五步:在命令模式下按“:”键,再次进入编辑模式,输入“wq”命令保存文本同时退出vim编辑器。这样,vimtest文本文件就生成了,用下面的命令可以查看该文件内容:rootlocalhost#cat vimtest-n1Hellovim!2Iambigfanofyou.8.1 vim编辑器58.1.2 vim基本命令1插入命令插入命令共有“a”、“A”、“i”、“I”、“o”和“O”六个,这六个命令必须在命令
4、模式下使用,其含义和功能见表8.1。2定位命令 在编辑大文件时,经常需要在文件中加入行号并进行快速定位,vim编辑器定位命令及功能如表8.2所示。表8.2 vim定位命令的含义及功能表8.1 vim插入命令的含义及功能命令含义及功能命令含义及功能a在光标所在字符后插入I在光标所在行首插入A在光标所在行尾插入o在光标所在行的下一行插入新行i在光标所在字符前插入O在光标所在行的上一行插入新行命令含义及功能运行模式set nu在文件中设置行号编辑模式set nonu在文件中取消行号编辑模式gg定位到第一行命令模式GG定位到最后一行命令模式nG定位到第n行命令模式n定位到第n行编辑模式$定位到光标所在
5、行的行尾命令模式0定位到光标所在行的行首命令模式8.1 vim编辑器68.1.2 vim基本命令3删除命令vim中的删除名可以一次删除一个字符或多个字符,也可以一次删除一行或多行,也可以一次删除指定范围的行,具体删除命令及功能如表8.3所示。4复制、剪切和粘贴命令 vim中的复制、剪切与粘贴命令如表8.4所示。表8.4 vim复制、剪切与粘贴命令的含义及功能表8.3 vim删除命令的含义及功能命令含义及功能运行模式yy复制当前行命令模式nyy复制当前行以下的n行(包括当前行)命令模式dd剪切当前行命令模式ndd剪切当前行以下的n行(包括当前行)命令模式p粘贴到当前行的下一行命令模式P粘贴到当前
6、行的上一行命令模式命令含义及功能运行模式x删除光标所在处的字符命令模式nx删除光标所在处的后n个字符命令模式dd删除光标所在行命令模式ndd删除光标所在处后n行命令模式dG删除光标所在行及至文件末尾的所有内容命令模式D删除光标所在处至行尾的所有内容命令模式n1,n2d删除n1行至n2行的所有内容编辑模式8.1 vim编辑器78.1.2 vim基本命令5替换和撤销命令vim中有专门的替换和撤销命令,其功能如表8.5所示。6字符串查找与替换命令vim中字符串替换与查找命令及其功能如表8.6所示。表8.6 vim字符串查找与替换命令的含义及功能表8.5 vim替换和撤销命令的含义及功能命令含义及功能
7、运行模式r取代光标所在处的字符,先按“r”键,紧接着输入正确字符即可命令模式R从光标所在处开始替换字符,直到按下”Esc”键结束命令模式u取消上一步的操作命令模式命令含义及功能运行模式“/”+字符串查找指定的字符串命令模式n与第一条命令配合使用,查找指定字符串出现的下一个位置命令模式set ic或略大小写编辑模式set noic区分大小写编辑模式%s/old_string/new_string/g或c全文替换(命令中“g”表示在替换时不询问,“c”表示要询问确认)编辑模式n1,n2s/old_string/new_string/g或c在指定范围内全文替换(命令中“g”表示在替换时不询问,“c”
8、表示要询问确认)编辑模式8.1 vim编辑器88.1.2 vim基本命令7保存和退出命令vim中保存和退出命令及其功能如表8.7所示。8导入命令执行结果或文件内容命令在编辑模式下,如果某条命令有可视的执行结果,则可以将命令的执行结果导入到当前文件光标所在位置,其格式是:“r!命令”。如果要导入文件内容,直接执行“r 文件名”命令。下面举例说明:例8.2把当前文件系统中各分区空间使用情况追加到vimtest文件中。第一步:用vim打开vimtest文件,并把光标移动到文件末尾第二步:在编辑模式下,执行“r!df-h”命令。也就是说,在vim的编辑模式下可以通过“r!命令”的方式来执行Linux命
9、令。表8.7 保存和退出命令的含义及功能命令含义及功能运行模式w保存修改编辑模式w new_filename用指定文件名另存文件编辑模式wq保存并退出编辑模式ZZ保存修改并退出的快捷键编辑模式q!不保存退出编辑模式wq!保存修改并退出(当文件的所有者或root用户对文件没有写权限时,可以使用该命令强制保存并退出)编辑模式8.2 Shell与Shell脚本98.2.1 Shell简介Shell是Linux/Unix的一个命令行解释器,它为用户提供与系统内核进行信息交互的接口,Shell把用户输入的命令解释为内核可识别的指令进行执行,然后把执行结果经Shell解释为用户可识别符号显示出来。Shel
10、l也是一个功能强大的编程语言,有自己的编程语法,也可以直接调用Linux/Unix系统命令,用户可以利用Shell编写成具有特定功能的Shell脚本程序。Shell的种类较多,目前Linux使用的基本Shell就是BourneShell下的bash(Linux支持的Shell都保存在/etc/shells文件中),本章我们以bash为例,介绍Shell脚本程序的设计方法。8.2 Shell与Shell脚本108.2.2 Shell脚本的执行方式1编写Shell脚本的基本规范在编写Shell脚本程序时要遵循如下基本规范:u Linux系统中,文件是不需要扩展名的,但为了方便用户管理和使用,我们习
11、惯用“.sh”作为Shell脚本文件名的后缀。u 在程序第一行输入“#!/bin/bash”,表示执行该Shell脚本程序时用的解释器是“/bin/bash”,当然,如果是用的其它解释器,则替换为相应的解释器即可。需要注意的是:这里的“#”不是注释,它和“!”一起用来声明该脚本程序所用的解释器。u 接下来用简明的语言概括所编写程序要完成的功能、编写日期、作者信息等,可以根据内容分行输入,但必须用“#”加以注释,当然这些内容不是必须的。u 输入程序指令,并做必要的注释。2编写第一个Shell脚本程序 第一步:输入如下命令,进入vim编辑器:rootlocalhost shelltest#vim
12、helloLinux.sh 第二步:在打开的HelloLinux.sh文件中输入如下内容,并保存退出。#!/bin/bash#HelloLinux!#author:yh#date:2018.8.10echohelloLinux!这样,就创建了第一Shell脚本程序文件HelloLinux.sh,该程序的解释器是/bin/bash,程序名称是“HelloLinux!”,作者是yh,编写日期是2018.8.10,程序功能是向屏幕输出“HelloLinux!”。8.2 Shell与Shell脚本118.2.2 Shell脚本的执行方式3Shell脚本的执行方式Shell脚本的执行方式有两种,可以通过
13、bash命令来执行,也可以赋予用户执行权限,直接运行相应的Shell脚本。u 通过bash命令调用执行,其格式是:bash 脚本程序名,如:rootlocalhost/#bash/tmp/shelltest/helloLinux.sh helloLinux!u 赋予执行权限,直接执行,如:rootlocalhost/#chmod 755/tmp/shelltest/helloLinux.shrootlocalhost/#/tmp/shelltest/helloLinux.sh HelloLinux!4DOS脚本与Unix脚本的相互转换Windows下编写的Shell脚本往往不能再Linux系统
14、下正常执行,其原因之一是有些不可见的字符,如回车符,在Linux与Windows之间不相互兼容,在运行脚本时,往往会出现类似“-bash:./helloLinux.sh:/bin/bashMbadinterpreter”这样的提示信息,这时需要将DOS格式的脚本转换为Unix格式的脚本,可以有两种方法实现脚本转换:u 利用dos2Unix命令,如:rootlocalhost shelltest#dos2unix./helloLinux.sh dos2unix:convertingfile./helloLinux.shtoUNIXformat.#转换成了Unix格式的脚本当然,也可以用unix2
15、dos命令把Unix格式Shell脚本转换为DOS格式的Shell脚本。u 在vim编辑器的编辑模式下,输入:“set ff=unix”或“set ff=dos”命令,进行格式转换。8.3 Bash基本功能128.3.1 Linux历史命令和命令补全Linux中,每个用户的家目录下都有一个隐藏文件.bash_history,该文件自动保存用户使用过的所有历史命令,系统默认最多保存1000条,这个值可以通过编辑环境变量配置文件/etc/profile的相关条目来修改,当命令条数超过最大值1000时,淘汰最先使用过的命令。下面介绍对历史命令的查看、保存和利用任何用户都可以执行history命令,来
16、查看自己的历史命令,也可以手动将使用过的命令写入自己的.bash_history文件或其它文件。1查看、清除历史命令history命令用来查看、清除自己的历史命令。命令格式:rootlocalhost#history 选项参数 参数说明:N表示第N条历史命令,缺省参数表示全部命令。选项说明:c表示清除全部历史命令。d与参数N配合使用,表示清除第N条历史命令。缺省选项,时用于查看历史命令。例8.3 可用如下命令查询历史命令中的第10条命令:rootlocalhost#history 10 例8.4 可用如下命令删除历史命令中的第100条命令:rootlocalhost#history-d 100
17、8.3 Bash基本功能138.3.1 Linux历史命令和命令补全2保存历史命令history命令的另一个功能是将历史命令保存到.bash_history或指定文件。命令格式:rootlocalhost#history-a|-w 文件名选项说明:a表示只保存相对于.bash_history文件的新增命令。w表示保存.bash_history文件中的已有命令和新增命令。Linux并不会立即把执行过的命令保存到.bash_history文件中,可以使用该命令来把执行过的命令保存到指定文件中,默认保存到.bash_history文件。3调用历史命令有些命令书写起来较复杂,这时可以调用历史命令。(1
18、)!命令用来重复执行前一条命令。命令格式:rootlocalhost#!!(2)!String命令调用最近执行过的以String字符串开头的命令。命令格式:rootlocalhost#!String如要执行最近执行过的以“ls”字符串开头的命令,可执行如下命令:rootlocalhost#!ls(3)!N命令用来执行历史命令中的第N条命令。如要调用第100条命令,可执行如下命令:rootlocalhost#!1008.3 Bash基本功能148.3.1 Linux历史命令和命令补全4命令和文件补全在输入命令或文件、目录时,可以利用Tab键的补全功能将命令或文件、目录名称补充完整。如,当用户输入
19、“his”字符串后,再按Tab键,这时如果以“his”开头的命令具有唯一性,则会把该命令补全,如“history”,如果以“his”开头的命令不唯一,则再按Tab键,系统会列出以“his”开头的所有命令。Tab键对于文件和目录也具有类似的功能,使用Tab键的补全功能,可以为命令、文件的输入提供极大方便。命令别名,就是为长命令或复杂命令定义一个较简单的名称,通过执行别名来达到与执行原命令同样的效果。1命令别名u 查看已定义的别名使用如下命令格式:rootlocalhost#aliasu 定义命令别名使用如下命令格式:rootlocalhost#alias 命令别名=原命令 例8.5 可用如下命令
20、为命令“yumyinstall”定义别名为“yum”:rootlocalhost#alias yum=yum-y install这样,命令yumunix2dos的功能就相当于执行命令yumyinstallunix2dos。如:rootlocalhost#yum unix2dos8.3.2 命令别名和快捷键 8.3 Bash基本功能158.3.3 输入输出重定向删除命令别名使用如下命令格式:rootlocalhost#unalias 别名当然也可以通过编辑用户的.bashrc文件来删除。使用命令别名需要注意的事项:定义新的别名时,要慎重为命令别名命名,避免新定义的别名把原来命令的功能覆盖了。当有
21、名称相同的命令和命令别名时,优先执行顺序如下:首先是带路径的命令、其次是命令别名,再次是Bash内部命令,然后是$PATH环境变量中定义的第一个名称相同的命令。通过命令行定义的命令别名只能临时生效,要永久生效,就需要将命令别名的定义写入.bashrc文件。每个用户都有一个.bashrc文件,在自己的家目录下,如:root用户的.bashrc是/root/.bashrc2Bash常用的快捷键Bash中常用的快捷键及功能如表8.8所示:转义控制字符功能描述Ctrl+A把光标移动到命令行开头Ctrl+E把光标移动到命令行末尾Ctrl+C强制终止当前命令Ctrl+L清屏,相当于clear命令Ctrl+
22、U删除或剪切光标之前的命令Ctrl+K删除或剪切光标之后的命令Ctrl+Y粘贴剪贴中的内容Ctrl+R调出搜索界面,在历史命令中搜索相关命令Ctrl+D退出当前终端Ctrl+Z将当前命令(任务)放入后台执行Ctrl+S暂停屏幕输出Ctrl+Q恢复屏幕输出8.3 Bash基本功能168.3.3 输入输出重定向1标准输入输出计算机系统的输入输出设备很多,但在Linux系统中,我们只把键盘作为标准输入设备,其设备文件名是/dev/stdin,文件描述符是0,把显示器作为标准的输出设备,其设备文件名是/dev/stdout,文件描述符为1,同时把显示器也当作标准错误输出设备,文件名是/dev/stde
23、rr,文件描述符是2。如果我们要用到非标准输入输出设备时,就需要使用Linux提供的输入输出重定向功能。2输出重定向输出重定向就是将命令的执行结果重定向到文件或其它非标准输出设备。输出重定向包括标准输出重定向和标准错误输出重定向。u 标准输出重定向命令格式rootlocalhost#命令|文件把命令的执行结果以覆盖()或追加()的方式输出到指定的文件或设备。u 标准错误输出重定向命令格式rootlocalhost#错误命令 2|2 文件把命令的错误执行结果以覆盖(2)或追加(2)的方式输出的指定到文件或设备。8.3 Bash基本功能178.3.3 输入输出重定向 例8.6 可用如下命令将cat
24、lsl命令的输出结果以覆盖的方式输出到redirect_test.txt文件:rootlocalhost temp#ls-l redirect_test.txtrootlocalhost temp#cat redirect_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文件:rootlocalhost temp
25、#date redirect_test.txt rootlocalhost temp#cat redirect_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如果命令书写错误,系统会提示“找不到该命令”等信息。如:rootlocalhosttemp#data#误将命令“date”写成了“data”bash:data:commandnotfound
26、#错误输出直接输出到标准输出设备显示器 有时,我们需要将错误命令产生的提示信息写入到指定的文件。8.3 Bash基本功能188.3.3 输入输出重定向 例8.8 可用如下命令将错误的执行结果以覆盖的方式输出到redirect_test.txt文件:rootlocalhost temp#data 2 redirect_test.txt#输出到文件后,不再在屏幕显示rootlocalhost temp#cat redirect_test.txt#错误输出覆盖了文件中原有的内容bash:data:commandnotfound而在实际中,我们不一定能预测到某条命令是否能正确执行,所以需要一种两全其美
27、的方法,不管命令能否正确执行,都能将其结果保存下来。u 将命令的正确执行结果或错误执行结果都保存在同一个文件中。命令格式:rootlocalhost#命令&|&文件不管命令是否正确执行,将其执行结果以覆盖(&)或追加(&)的方式输出到指定的文件或设备。u 将命令的正确执行结果和错误执行结果分别保存在不同的文件中。命令格式:rootlocalhost#命令|文件1 2|2 文件2把命令的正确执行结果以覆盖()或追加()的方式输出到文件1,如果执行错误,则以覆盖()或追加()的方式输出到文件2。这种情况一般用追加的方式输出,如果用覆盖的方式,不管输出到哪个文件,都同时先清空两个文件。然后再向相应文
28、件输出。8.3 Bash基本功能198.3.3 输入输出重定向 例8.9 无论命令能否正确执行,都将其执行结果追加到redirect_test.txt:执行如下命令,将正确命令“ls-l”的执行结果追加到redirect_test.txt:rootlocalhost temp#ls-l&redirect_test.txt 执行如下命令,将错误命令“lsss-l”的执行结果追加到redirect_test.txt:rootlocalhost temp#lsss-l&redirect_test.txt#专设错误命令“lsss”,以供实验rootlocalhost temp#cat redirect
29、_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行是文件原有的内容,第25行是正确执行结果,第6行是错误执行结果。例8.10 可用如下命令将命令的正确执行结果追加到redirect_test.txt1,错误执行结果追加到redi
30、rect_test.txt2文件:rootlocalhost temp#ls-l redirect_test.txt1 2 redirect_test.txt23输入重定向输入重定向,是指输入不是来源于标准的输入设备(如键盘),而是来源于文件或非标准输入设备。输入重定向在实际中用的很少,这里举例说明输入重定向的简单用法。例8.11 统计redirect_test.txt文件中的单词数。下列命令将输入重定向到了redir_test.txt,将该文件的内容作为命令“wcw”的输入:rootlocalhost temp#wc-w redirect_test.txt39得知,redirect_test
31、.txt文件共有39个单词。8.3 Bash基本功能208.3.4 多命令执行与管道符1多命令执行Bash支持的多命令执行,主要有如下三种情况:u 顺序执行所有命令。把需要执行的多条命用“;”号连接起来,系统就会顺序执行各条命令,不管前面的命令能否正确执行,所有的命令都会执行。例8.12 下面四条命令ls-l、date、cd/user和pwd可以顺序执行:rootlocalhost temp#ls-l;date;cd/user;pwd结果分析:这四条命令会顺序执行,由于没有/user目录,所以cd/user命令不能正确执行,但不影响其后pwd命令的执行。u 顺序执行所有命令,直到错误命令。用“
32、&”连接的n条命令中,只有前面的命令都正确执行了,才会执行下一条命令,若某一条命令不能正确执行,则其后的命令都停止执行。例8.13 下面四条命令ls、pwd、cd/user和cat/etc/passwd执行过程中,若某条命令不能正确执行,则其后所有命令停止执行。rootlocalhost temp#ls&pwd&cd/user&cat/etc/passwd结果分析:ls命令可以正确执行,所以pwd命令就可以执行,同理,cd/user命令就可以执行,但由于该命令不能正确执行,所以其后的cat/etc/passwd命令停止执行。8.3 Bash基本功能218.3.4 多命令执行与管道符1多命令执行
33、u 顺序执行第一条正确命令用“|”连接的n条命令中,只有前面的命令都不能正确执行时,才会执行下一条命令,当某条命令正确执行后,则其后的所有命令不管能否正确执行,都不执行。例8.14 下面四条命令lsld/user、cd/user、pwd和cat/etc/passwd顺序执行第一条正确命令:rootlocalhost temp#ls-ld/user|cd/user|pwd|cat/etc/passwd结果分析:第一条命令中由于不存在目录/user,不能正确执行,所以顺序执行第二条命令,同理,第二条命令也不能正确执行,所以顺序执行第三条命令,由于第三条命令可以正确执行,所以即使其后的命令可以正确执
34、行,也不再执行了。例8.15 把硬盘/dev/sdb的全部数据拷贝到硬盘/dev/sda中,计算所用时间:第一步:执行如下命令,将/dev/sdb的全部数据拷贝到硬盘/dev/sda,并记录开始时间和结束时间:rootlocalhost temp#date;dd if=/dev/sdb of=/dev/sda;date 第二步:用结束时间减去开始时间就是所用时间(具体计算略)。对磁盘拷贝命令做如下说明:命令格式:rootlocalhost#dd if=输入文件(来源文件)of=输出文件(目标文件)bs=每个数据块的字节数 count=数据块数该命令主要用于磁盘之间的拷贝,当然也可以用于文件之间
35、的非全文拷贝。8.3 Bash基本功能228.3.4 多命令执行与管道符1多命令执行 例8.16 可用如下命令将redirect_test.txt文件中的前30个字节拷贝到redirect_test.txt2文件:rootlocalhost temp#dd if=redirect_test.txt of=redirect_test.txt2 bs=2 count=15 执行结果为:记录了15+0的读入记录了15+0的写出30字节(30B)已复制,0.000182272秒,165kB/秒 例8.17 在Shell编程中,可用如下指令判断cd命令能否正确执行:rootlocalhost usr#c
36、d/usr&echo 执行正确!|echo 执行错误!执行结果:执行正确!rootlocalhost usr#cd/user&echo 执行正确!|echo 执行错误!执行结果:bash:cd:/user:没有那个文件或目录执行错误!注意:符号“&”与“|”的顺序不能互换!2管道符 管道符用“|”符号来表示,管道符连接的两条命令中,前一条命令的执行结果作为后一条命令的操作对象,所以前一条命令必须要有正确的输出结果。其命令格式是:rootlocalhost#命令1|命令2|命令3|命令n例8.18 可用如下命令分屏显示/etc/services文件中含“/tcp”字符串的条目:rootlocal
37、host#cat/etc/services|grep/tcp|more上述命令中命令cat/etc/services的执行结果,作为命令grep/tcp操作对象,来查找包含“/tcp”的条目,命令grep/tcp执行结果又作为命令more的操作对象,进行分屏显示。8.3 Bash基本功能238.3.5 通配符与特殊符号1通配符Bash支持功能强大的通配符,常用的通配符及其含义如表8.9所示。下面举例说明通配符的用处:例8.19 可用如下命令删除/tmp/temp目录下的所有文件:rootlocalhost temp#cd/tmp/temp/rootlocalhost temp#rm-fr*#删
38、除当前目录下的所有文件,谨慎使用该命令!例8.20 可用如下命令显示/tmp目录下的所有以数字字符开头的文件:rootlocalhost tmp#ls-l 1-9*表8.9通配符及其含义通配符含义?匹配任意一个字符。*匹配0个或任意多个任意字符。匹配中括号中的任意一个字符,如abc可以与a匹配,也可以与b匹配,还可以与c匹配。起始字符-结束字符匹配起始字符与结束字符之间的任何一个字符,如A-Z代表任何一个大写字母。起始字符-结束字符取反,表示除了中括号内的任何字符,如0-9代表任意一个非数字字符.8.3 Bash基本功能248.3.5 通配符与特殊符号2特殊符号Shell脚本设计常用的特殊符号
39、如表8.10所示。例8.20 在屏幕原文输出“Kindnessisthemostbeautifulquality”:rootlocalhost#echo Kindess is the most beautiful quality 执行结果:Kindessisthemostbeautifulquality因为原文输出的内容包含了空格符号,所以必须使用引号引起来,如果是单个单词或没有空格,则可以不使用引号。8.21 先定义一个变量,同时赋初值“yh”,然后将其值输出到屏幕:rootlocalhost#name=yh#定义变量name,并赋予值“yh”rootlocalhost#echo$name#
40、输出变量mame的值,“$”表示变量取name的值yhrootlocalhost#echo my name is$name#双引号内的特殊符号“$”仍然有效mynameisyhrootlocalhost#echo my name is$name#单引号内的特殊符号全部失效mynameis$name表8.10 特殊符号及其含义符号含义 单引号,原文输出引号内的内容,引号内,特殊符号的功能都失效。“”双引号,原文输出引号内的内容,引号内,除“$”、“”和“”三个符号保留特殊符号的含义外,其它特殊符号的功能都失效。反引号,反引号内的内容是系统命令,在Bash中优先执行,与$()作用相同,推荐使用$(
41、)。$()与反引号作用相同,引用系统命令的执行结果。如:rootlocalhost#echo$(date)2018年08月12日星期日08:36:09CST#Shell脚本中的行注释符号。$引用变量的值,如$ID的作用是引用变量ID的值。转义符,使其后的字符失去特殊含义而变成普通字符输出。8.4 Bash命令258.4.1 变量的基本概念1变量类型Bash中,根据变量的作用不同,可以分为四种变量:u用户自定义变量:由用户根据需要定义,用户可以随时修改变量的值。自定义变量的作用域是当前Shell。u环境变量:保存与系统运行环境相关的数据,用户也可以自定义环境变量,也可以调整环境变量的值来实现相应
42、的功能。环境变量的作用域是当前Shell及其子Shell,如果把环境变量写入相应的配置文件,那么,它的作用域是所有Shell。u位置参数变量:这种变量的作用是固定的,由系统定义,主要用来向脚本传递相关值。u 预定义变量:Bash预先定义好的变量,有固定的作用,不能由用户定义。2父Shell与子Shell父Shell与子Shell是相对的,如果把当前Shell作为父Shell,则在命令行输入相应的Shell名称就能进入对应的子Shell,用pstree命令可以查看当前所处的Shell。如:rootlocalhost#csh#进入子ShellCshrootlocalhost#bash#进入子She
43、llBashrootlocalhost#pstree#查看所在Shell输出结果:sshdsshdbashcshbashpstree第一个bash是执行命令前的Shell,即当前Shell,执行名csh后进入子ShellCsh,执行命令bash后,进入下一级ShellBash。以“csh”为参照,前一个“bash”是它的父Shell,后一个“bash”是它的子Shell。要退出当前Shell,执行exit命令即可,退出Shell时,在当前Shell声明的所有变量都将被清空,除非将其写入配置文件。8.4 Bash命令268.4.1 变量的基本概念3变量命名规则像其它编程语言一样,Bash变量的命
44、名也要遵循相应的规则:Bash变量名只能包含字母、数字和下划线,但不能以数字开头;Bash变量的默认类型都是字符串类型,如果需要进行算术运行,则需要设定其为数值类型;自定义变量习惯于用小写字母,环境变量变量用大写字母。2变量赋值可以为定义好的变量重新赋值,变量重新赋值与变量定义的格式完全相同。如:system=Unix,就是把变量system的值重新赋值为“Unix”。变量值如果有空格,则需要使用单引号或双引号将其括起来,如:department=”Quality management”表示变量department的值是“Qualitymanagement”。也可以把一个变量的值赋予另一个变量
45、,或把某条命令的执行结果赋值给变量。3变量引用由前述所知,引用变量的值,要在变量名前加“$”,引用命令的执行结果要使用“$(命令名)”格式。如:system1=$system,表示把变量system的值赋值给了变量system1;result=$(date),表示把命令date的执行结果赋值给了变量result。8.4.2 用户自定义变量1声明自定义变量变量首次被赋值的同时,被声明,其格式是:变量名=变量值变量名与变量值用“=”链接,“=”两侧不能有空格。如:system=Linux,就是定义一个名为system的变量,并设置变量的初始值为“Linux”,这样,变量system就定义好了。8.
46、4 Bash命令278.4.2 用户自定义变量4连接字符串连接两个字符串变量的格式为:$变量1$变量2链接字符串变量与字符串常量的格式为:“$变量”常量 或常量“$变量”或$变量常量 或常量$变量5查看变量rootlocalhost#set查看系统中保存的所有变量6删除变量rootlocalhost#unset 变量名删除指定变量1声明环境变量用户自己可以声明环境变量,格式为:export 变量名=变量值其中,export是声明环境变量的关键字。如:export BIRTHDAY=2018年8月14日,声明BIRTHDAY是环境变量,其初始值是2018年8月14日。声明环境变量也可以先给变量赋
47、值,然后将其声明为环境变量。如:rootlocalhost#AGE=18rootlocalhost#export AGE这样,环境变量BIRTHDAY和AGE,不仅在当前Shell中生效,而且还在其子Shell中生效,但不能在父Shell中生效。为了使环境变量能在所有Shell中长期生效,可以把环境变量的声明写入用户的配置文件中,如root的配置文件是/root/.bashrc,然后重启系统即可。8.4.3 环境变量8.4 Bash命令288.4.3 环境变量2查看和删除环境变量set命令可以查看所有变量,env命令专门用于查看系统变量。删除系统变量的方法类似于删除用户自定义变量,可使用uns
48、et命令,如删除AGE系统变量,可以使用如下命令:rootlocalhost#unset AGE环境变量的赋值、引用与自定义变量相同,这里不再赘述。3常用的系统自定义环境变量用env命令可以查看到系统全部的环境变量,下面介绍几个常用的环境变量。u 系统查找命令的路径:PATH环境变量系统在执行命令时,并不需要我们输入命令所在的路径,而是直接在命令行输入命令本身即可。原因就是所有命令的路径都保存在PATH环境变量中。PATH环境变量的值是用“:”分割的一串路径,系统执行命令时,搜索PATH环境变量保存的路径从而找到命令所对应的命令文件。执行如下命令,可以查看PATH环境变量的值:rootloca
49、lhost#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是用户
50、自己编写Shell脚本文件,要想在任何目录提示符下输入文件名remounttest.sh就能执行该脚本,必须把它的目录/home添加到PATH环境变量中:rootlocalhost home#PATH=$PATH:/home#把/home加入PATH变量,用“:”分割8.4 Bash命令298.4.3 环境变量2查看和删除环境变量rootlocalhost home#echo$PATH/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/home#/home目录