宿迁宿城区屠园乡网站建设,wordpress媒体库有错误,深圳精品网站建设公司,英文外贸网站设计【BASH】回顾与知识点梳理 十七 十七. 什么是 Shell scripts17.1 干嘛学习 shell scripts自动化管理的重要依据追踪与管理系统的重要工作简单入侵检测功能连续指令单一化简易的数据处理跨平台支持与学习历程较短 17.2 第一支 script 的撰写与执行撰写第一支 script 17.3 撰写 s… 【BASH】回顾与知识点梳理 十七 十七. 什么是 Shell scripts17.1 干嘛学习 shell scripts自动化管理的重要依据追踪与管理系统的重要工作简单入侵检测功能连续指令单一化简易的数据处理跨平台支持与学习历程较短 17.2 第一支 script 的撰写与执行撰写第一支 script 17.3 撰写 shell script 的良好习惯建立17.4 简单范例对谈式脚本变量内容由用户决定随日期变化利用 date 进行文件的建立数值运算简单的加减乘除数值运算透过 bc 计算 pi 17.5 script 的执行方式差异 (source, sh script, ./script)利用直接执行的方式来执行 script利用 source 来执行脚本在父程序中执行 该系列目录 -- 【BASH】回顾与知识点梳理目录
如果你真的很想要走信息这条路并且想要管理好属于你的主机那么别说鸟哥不告诉你 可以自动管理系统的好工具 Shell scripts这家伙真的是得要好好学习学习的 基本上 shell script 有点像是早期的批处理文件亦即是将一些指令汇整起来一次执行但是 Shell script 拥有更强大的功能那就是他可以进行类似程序 (program) 的撰写并且不需要经过编译 (compile) 就能够执行 真的很方便。加上我们可透过 shell script 来简化我们日常的工作管理 而且整个Linux 环境中一些服务 (services) 的启动都是透过 shell script 的 如果你对于 script 不了解嘿嘿发生问题时可真是会求助无门喔所以好好的学一学他吧
十七. 什么是 Shell scripts
什么是 shell script (程序化脚本) 呢就字面上的意义我们将他分为两部份。 在『 shell 』部分那是一个文字接口底下让我们与系统沟通的一个工具接口。那么『 script 』是啥 字面上的意义 script 是『脚本、剧本』的意思。整句话是说 shell script 是针对 shell 所写的『剧本』
什么东西啊其实 shell script 是利用 shell 的功能所写的一个『程序 (program)』这个程序是使用纯文本文件将一些 shell 的语法与指令(含外部指令)写在里面 搭配正规表示法、管线命令与数据流重导向等功能以达到我们所想要的处理目的。
所以简单的说 shell script 就像是早期 DOS 年代的批处理文件 (.bat) 最简单的功能就是将许多指令汇整写在一起 让使用者很轻易的就能够 one touch 的方法去处理复杂的动作 (执行一个文件 “shell script” 就能够一次执行多个指令)。 而且 shell script 更提供数组、循环、条件与逻辑判断等重要功能让用户也可以直接以 shell 来撰写程序而不必使用类似 C 程序语言等传统程序撰写的语法呢
这么说你可以了解了吗是的 shell script 可以简单的被看成是批处理文件 也可以被说成是一个程序语言且这个程序语言由于都是利用 shell 与相关工具指令 所以不需要编译即可执行且拥有不错的除错 (debug) 工具所以他可以帮助系统管理员快速的管理好主机。
17.1 干嘛学习 shell scripts
这是个好问题『我又干嘛一定要学 shell script 我又不是信息人没有写程序的概念 那我干嘛还要学 shell script 呢不要学可不可以啊』呵呵如果 Linux 对你而言 你只是想要『会用』而已那么不需要学 shell script 也还无所谓这部分先给他跳过去 等到有空的时候再来好好的瞧一瞧。但是如果你是真的想要玩清楚 Linux 的来龙去脉 那么 shell script 就不可不知为什么呢因为
自动化管理的重要依据
不用鸟哥说你也知道管理一部主机真不是件简单的事情每天要进行的任务就有查询登录档、追踪流量、监控用户使用主机状态、主机各项硬设备状态、 主机软件更新查询、更不要说得应付其他使用者的突然要求了。而这些工作的进行可以分为 (1)自行手动处理或是 (2)写个简单的程序来帮你每日『自动处理分析』这两种方式你觉得哪种方式比较好 当然是让系统自动工作比较好对吧呵呵这就得要良好的 shell script 来帮忙的啦
追踪与管理系统的重要工作
虽然我们还没有提到服务启动的方法不过这里可以先提一下我们 CentOS 6.x 以前的版本中系统的服务 (services) 启动的接口是在 /etc/init.d/ 这个目录下目录下的所有文件都是 scripts 另外包括开机 (booting) 过程也都是利用 shell script 来帮忙搜寻系统的相关设定数据 然后再代入各个服务的设定参数啊举例来说如果我们想要重新启动系统注册表档 可以使用『/etc/init.d/rsyslogd restart』那个 rsyslogd 文件就是 script 啦
另外鸟哥曾经在某一代的 Fedora 上面发现启动 MySQL 这个数据库服务时确实是可以启动的 但是屏幕上却老是出现『failure』后来才发现原来是启动 MySQL 那个 script 会主动的以『空的密码』去尝试登入 MySQL 但为了安全性鸟哥修改过 MySQL 的密码啰当然就登入失败 后来改了改 script 就略去这个问题啦如此说来 script 确实是需要学习的啊
时至今日虽然 /etc/init.d/* 这个脚本启动的方式 (systemV) 已经被新一代的 systemd 所取代(从 CentOS 7 开始) 但是很多的个别服务在管理他们的服务启动方面还是使用 shell script 的机制喔所以最好还是能够熟悉啦
简单入侵检测功能
当我们的系统有异状时大多会将这些异状记录在系统记录器也就是我们常提到的『系统注册表档』 那么我们可以在固定的几分钟内主动的去分析系统注册表档若察觉有问题就立刻通报管理员 或者是立刻加强防火墙的设定规则如此一来你的主机可就能够达到『自我保护』的聪明学习功能啦 举例来说我们可以通过 shell script 去分析『当该封包尝试几次还是联机失败之后就予以抵挡住该 IP』之类的举动例如鸟哥写过一个关于抵挡砍站软件的 shell script 就是用这个想法去达成的呢
连续指令单一化
其实对于新手而言 script 最简单的功能就是『汇整一些在 command line 下达的连续指令将他写入 scripts 当中而由直接执行 scripts 来启动一连串的 command line 指令输入』例如防火墙连续规则 (iptables)开机加载程序的项目 (就是在 /etc/rc.d/rc.local 里头的数据) 等等都是相似的功能啦 其实说穿了如果不考虑 program 的部分那么 scripts 也可以想成『仅是帮我们把一大串的指令汇整在一个文件里面 而直接执行该文件就可以执行那一串又臭又长的指令段』就是这么简单啦
简易的数据处理
由前一章正规表示法的 awk 程序说明中 你可以发现 awk 可以用来处理简单的数据数据呢例如薪资单的处理啊等等的。 shell script 的功能更强大例如鸟哥曾经用 shell script 直接处理数据数据的比对啊 文字数据的处理啊等等的撰写方便速度又快(因为在 Linux 效能较佳)真的是很不错用的啦
举例来说鸟哥每学期都得要以学生的学号来建立他们能够操作 Linux 的系统账号然后每个账号还得要能够有磁盘容量的限制 (quota) 以及相关的设定等等 那因为学校的校务系统提供的数据都是一整串学生信息并没有单纯的学号字段所以鸟哥就得要透过前几章的方法搭配 shell script 来自动处理相关设定流程 这样才不会每学期都头疼一次啊
跨平台支持与学习历程较短
几乎所有的 Unix Like 上面都可以跑 shell script 连 MS Windows 系列也有相关的 script 仿真器可以用 此外 shell script 的语法是相当亲和的看都看的懂得文字 (虽然是英文)而不是机器码 很容易学习这些都是你可以加以考虑的学习点啊
上面这些都是你考虑学习 shell script 的特点此外 shell script 还可以简单的以 vim 来直接编写实在是很方便的好东西所以还是建议你学习一下啦。
不过虽然 shell script 号称是程序 (program) 但实际上 shell script 处理数据的速度上是不太够的。因为 shell script 用的是外部的指令与 bash shell 的一些默认工具所以他常常会去呼叫外部的函式库因此指令周期上面当然比不上传统的程序语言。 所以啰 shell script 用在系统管理上面是很好的一项工具但是用在处理大量数值运算上 就不够好了因为 Shell scripts 的速度较慢且使用的 CPU 资源较多造成主机资源的分配不良。还好 我们通常利用 shell script 来处理服务器的侦测倒是没有进行大量运算的需求啊所以不必担心的啦
17.2 第一支 script 的撰写与执行
如同前面讲到的shell script 其实就是纯文本档我们可以编辑这个文件然后让这个文件来帮我们一次执行多个指令 或者是利用一些运算与逻辑判断来帮我们达成某些功能。所以啦要编辑这个文件的内容时当然就需要具备有 bash 指令下达的相关认识。 在 shell script 的撰写中还需要用到底下的注意事项
指令的执行是从上而下、从左而右的分析与执行指令的下达就如同前面提到的 指令、选项与参数间的多个空白都会被忽略掉空白行也将被忽略掉并且 [tab] 按键所推开的空白同样视为空格键如果读取到一个 Enter 符号 (CR) 就尝试开始执行该行 (或该串) 命令至于如果一行的内容太多则可以使用『 [Enter] 』来延伸至下一行『 # 』可做为批注任何加在 # 后面的资料将全部被视为批注文字而被忽略
如此一来我们在 script 内所撰写的程序就会被一行一行的执行。现在我们假设你写的这个程序文件名是 /home/dmtsai/shell.sh 好了那如何执行这个文件很简单可以有底下几个方法
直接指令下达 shell.sh 文件必须要具备可读与可执行 (rx) 的权限然后 绝对路径使用 /home/dmtsai/shell.sh 来下达指令相对路径假设工作目录在 /home/dmtsai/ 则使用 ./shell.sh 来执行变量『PATH』功能将 shell.sh 放在 PATH 指定的目录内例如 ~/bin/ 以 bash 程序来执行透过『 bash shell.sh 』或『 sh shell.sh 』来执行
反正重点就是要让那个 shell.sh 内的指令可以被执行的意思啦咦那我为何需要使用『./shell.sh 』来下达指令忘记了吗同时由于CentOS 默认用户家目录下的 ~/bin 目录会被设定到 ${PATH} 内所以你也可以将 shell.sh 建立在/home/dmtsai/bin/ 底下 ( ~/bin 目录需要自行设定) 。此时若 shell.sh 在 ~/bin 内且具有 rx 的权限那就直接输入 shell.sh 即可执行该脚本程序
那为何『 sh shell.sh 』也可以执行呢这是因为 /bin/sh 其实就是 /bin/bash (连结档)使用 sh shell.sh 亦即告诉系统我想要直接以 bash 的功能来执行 shell.sh 这个文件内的相关指令的意思所以此时你的 shell.sh 只要有 r 的权限即可被执行喔而我们也可以利用 sh 的参数如 -n 及 -x 来检查与追踪 shell.sh 的语法是否正确呢 ^_^
撰写第一支 script
在武侠世界中不论是那个门派要学武功要从扫地与蹲马步做起那么要学程序呢呵呵肯定是由『秀出 Hello World』 这个字眼开始的OK那么鸟哥就先写一支 script 给大家瞧一瞧
[dmtsaistudy ~]$ mkdir bin; cd bin
[dmtsaistudy bin]$ vim hello.sh
#!/bin/bash
# Program:
# This program shows Hello World! in your screen.
# History:
# 2015/07/16 VBird First release
PATH/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo -e Hello World! \a \n
exit 0在本章当中请将所有撰写的 script 放置到你家目录的 ~/bin 这个目录内未来比较好管理啦上面的写法当中鸟哥主要将整个程序的撰写分成数段大致是这样 第一行 #!/bin/bash 在宣告这个 script 使用的 shell 名称 因为我们使用的是 bash 所以必须要以『 #!/bin/bash 』来宣告这个文件内的语法使用 bash 的语法那么当这个程序被执行时他就能够加载 bash 的相关环境配置文件 (一般来说就是 non-login shell 的~/.bashrc) 并且执行 bash 来使我们底下的指令能够执行这很重要的(在很多状况中如果没有设定好这一行 那么该程序很可能会无法执行因为系统可能无法判断该程序需要使用什么 shell 来执行啊) 程序内容的说明 整个 script 当中除了第一行的『 #! 』是用来宣告 shell 的之外其他的 # 都是『批注』用途 所以上面的程序当中第二行以下就是用来说明整个程序的基本数据。一般来说 建议你一定要养成说明该script 的1. 内容与功能 2. 版本信息 3. 作者与联络方式 4. 建檔日期5. 历史纪录 等等。这将有助于未来程序的改写与 debug 呢 主要环境变量的宣告 建议务必要将一些重要的环境变量设定好鸟哥个人认为 PATH 与 LANG (如果有使用到输出相关的信息时) 是当中最重要的 如此一来则可让我们这支程序在进行时可以直接下达一些外部指令而不必写绝对路径呢比较方便啦 主要程序部分 就将主要的程序写好即可在这个例子当中就是 echo 那一行啦 执行成果告知 (定义回传值) 是否记得我们在第十章里面要讨论一个指令的执行成功与否可以使用 $? 这个变量来观察 那么我们也可以利用 exit 这个指令来让程序中断并且回传一个数值给系统。 在我们这个例子当中鸟哥使用 exit 0 这代表离开 script 并且回传一个 0 给系统 所以我执行完这个 script 后若接着下达 echo $? 则可得到0 的值喔 更聪明的读者应该也知道了呵呵利用这个 exit n (n 是数字) 的功能我们还可以自定义错误讯息 让这支程序变得更加的 smart 呢
接下来透过刚刚上头介绍的执行方法来执行看看结果吧
[dmtsaistudy bin]$ sh hello.sh
Hello World !你会看到屏幕是这样而且应该还会听到『咚』的一声为什么呢还记得前一章提到的 printf 吧用 echo 接着那些特殊的按键也可以发生同样的事情 不过 echo 必须要加上 -e 的选项才行呵呵
另外你也可以利用『chmod ax hello.sh; ./hello.sh』来执行这个 script 的呢
17.3 撰写 shell script 的良好习惯建立
一个良好习惯的养成是很重要的大家在刚开始撰写程序的时候最容易忽略这部分 认为程序写出来就好了其他的不重要。其实如果程序的说明能够更清楚那么对你自己是有很大的帮助的。
举例来说鸟哥自己为了自己的需求曾经撰写了不少的 script 来帮我进行主机 IP 的侦测啊、 登录档分析与管理啊、自动上传下载重要配置文件啊等等的不过早期就是因为太懒了 管理的主机又太多了常常同一个程序在不同的主机上面进行更改到最后到底哪一支才是最新的都记不起来 而且重点是我到底是改了哪里为什么做那样的修改都忘的一乾二净真要命
所以后来鸟哥在写程序的时候通常会比较仔细的将程序的设计过程给他记录下来而且还会记录一些历史纪录 如此一来好多了至少很容易知道我修改了哪些数据以及程序修改的理念与逻辑概念等等 在维护上面是轻松很多很多的喔
另外在一些环境的设定上面毕竟每个人的环境都不相同为了取得较佳的执行环境 我都会自行先定义好一些一定会被用到的环境变量例如 PATH 这个玩意儿 这样比较好啦所以说建议你一定要养成良好的 script 撰写习惯在每个 script 的文件头处记录好
script 的功能script 的版本信息script 的作者与联络方式script 的版权宣告方式script 的 History (历史纪录)script 内较特殊的指令使用『绝对路径』的方式来下达script 运作时需要的环境变量预先宣告与设定。
除了记录这些信息之外在较为特殊的程序代码部分个人建议务必要加上批注说明可以帮助你非常非常多 此外程序代码的撰写最好使用巢状方式在包覆的内部程序代码最好能以 [tab] 按键的空格向后推这样你的程序代码会显的非常的漂亮与有条理在查阅与 debug 上较为轻松愉快喔
另外使用撰写 script 的工具最好使用 vim 而不是 vi 因为 vim 会有额外的语法检验机制能够在第一阶段撰写时就发现语法方面的问题喔
17.4 简单范例
底下的范例在很多的脚本程序中都会用到而底下的范例又都很简单值得参考看看喔
对谈式脚本变量内容由用户决定
很多时候我们需要使用者输入一些内容好让程序可以顺利运作。 简单的来说大家应该都有安装过软件的经验安装的时候他不是会问你『要安装到那个目录去』吗 那个让用户输入数据的动作就是让用户输入变量内容啦。
你应该还记得在十章 bash 的时候我们有学到一个 read 指令吧现在请你以 read 指令的用途撰写一个 script 他可以让使用者输入1. first name 与 2. last name最后并且在屏幕上显示『Your full name is: 』的内容
[dmtsaistudy bin]$ vim showname.sh
#!/bin/bash
# Program:
# User inputs his first name and last name. Program shows his full name.
# History:
# 2015/07/16 VBird First release
PATH/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
read -p Please input your first name: firstname # 提示使用者输入将上面这个 showname.sh 执行一下你就能够发现用户自己输入的变量可以让程序所取用并且将他显示到屏幕上 接下来如果想要制作一个每次执行都会依据不同的日期而变化结果的脚本呢
随日期变化利用 date 进行文件的建立
想象一个状况假设我的服务器内有数据库数据库每天的数据都不太一样因此当我备份时希望将每天的资料都备份成不同的档名 这样才能够让旧的数据也能够保存下来不被覆盖。哇不同檔名呢这真困扰啊难道要我每天去修改 script
不需要啊考虑每天的『日期』并不相同所以我可以将档名取成类似 backup.2015-07-16.data 不就可以每天一个不同档名了吗呵呵确实如此。那个 2015-07-16 怎么来的那就是重点啦接下来出个相关的例子 假设我想要建立三个空的文件 (透过 touch) 档名最开头由使用者输入决定假设使用者输入 filename 好了那今天的日期是 2015/07/16 我想要以前天、昨天、今天的日期来建立这些文件亦即 filename_20150714, filename_20150715, filename_20150716 该如何是好
[dmtsaistudy bin]$ vim create_3_filename.sh
#!/bin/bash
# Program:
# Program creates three files, which named by users input and date command.
# History:
# 2015/07/16 VBird First release
PATH/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
# 1. 让使用者输入文件名并取得 fileuser 这个变量
echo -e I will use touch command to create 3 files. # 纯粹显示信息
read -p Please input your filename: fileuser # 提示使用者输入
# 2. 为了避免使用者随意按 Enter 利用变量功能分析档名是否有设定
filename${fileuser:-filename} # 开始判断有否配置文件名
# 3. 开始利用 date 指令来取得所需要的档名了
date1$(date --date2 days ago %Y%m%d) # 前两天的日期
date2$(date --date1 days ago %Y%m%d) # 前一天的日期
date3$(date %Y%m%d) # 今天的日期
file1${filename}${date1} # 底下三行在配置文件名
file2${filename}${date2}
file3${filename}${date3}
# 4. 将档名建立吧
touch ${file1} # 底下三行在建立文件
touch ${file2}
touch ${file3}上面的范例鸟哥使用了很多在第十章介绍过的概念 包括小指令『 $(command) 』的取得讯息、变量的设定功能、变量的累加以及利用 touch 指令辅助 如果你开始执行这个 create_3_filename.sh 之后你可以进行两次执行一次直接按 [Enter] 来查阅档名是啥 一次可以输入一些字符这样可以判断你的脚本是否设计正确喔
数值运算简单的加减乘除
各位看官应该还记得我们可以使用 declare 来定义变量的类型吧 当变量定义成为整数后才能够进行加减运算啊此外我们也可以利用『 $((计算式)) 』来进行数值运算的。 可惜的是 bash shell 里头预设仅支持到整数的数据而已。OK那我们来玩玩看如果我们要用户输入两个变量 然后将两个变量的内容相乘最后输出相乘的结果那可以怎么做
#!/bin/bash
# Program:
# User inputs 2 integer numbers; program will cross these two numbers.
# History:
# 2015/07/16 VBird First release
PATH/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo -e You SHOULD input 2 numbers, I will multiplying them! \n
read -p first number: firstnu
read -p second number: secnu
total$((${firstnu}*${secnu}))
echo -e \nThe result of ${firstnu} x ${secnu} is ${total}在数值的运算上我们可以使用『 declare -i total${firstnu}*${secnu} 』 也可以使用上面的方式来进行基本上鸟哥比较建议使用这样的方式来进行运算 var$((运算内容)) 不但容易记忆而且也比较方便的多因为两个小括号内可以加上空格符喔 未来你可以使用这种方式来计算的呀至于数值运算上的处理则有『, -, *, /, %』等等。 那个 % 是取余数啦举例来说 13 对 3 取余数结果是 134*31所以余数是 1 啊就是
[dmtsaistudy bin]$ echo $(( 13 % 3 ))
1这样了解了吧另外如果你想要计算含有小数点的数据时其实可以透过 bc 这个指令的协助喔例如可以这样做
[dmtsaistudy bin]$ echo 123.123*55.9 | bc
6882.575了解了 bc 的妙用之后来让我们测试一下如何计算 pi 这个东西呢
数值运算透过 bc 计算 pi
其实计算 pi 时小数点以下位数可以无限制的延伸下去而 bc 有提供一个运算 pi 的函式只是想要使用该函式必须要使用 bc -l 来呼叫才行。 也因为这个小数点以下位数可以无线延伸运算的特性存在所以我们可以透过底下这只小脚本来让使用者输入一个『小数点为数值』 以让 pi 能够更准确
#!/bin/bash
# Program:
# User input a scale number to calculate pi number.
# History:
# 2015/07/16 VBird First release
PATH/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo -e This program will calculate pi value. \n
echo -e You should input a float number to calculate pi value.\n
read -p The scale number (10~10000) ? checking
num${checking:-10} # 开始判断有否有输入数值
echo -e Starting calcuate pi value. Be patient.
time echo scale${num}; 4*a(1) | bc -lq上述数据中那个 4*a(1) 是 bc 主动提供的一个计算 pi 的函数至于 scale 就是要 bc 计算几个小数点下位数的意思。当 scale 的数值越大 代表 pi 要被计算的越精确当然用掉的时间就会越多因此你可以尝试输入不同的数值看看不过最好是不要超过 5000 啦因为会算很久 如果你要让你的 CPU 随时保持在高负载这个程序算下去你就会知道有多操 CPU 啰 鸟哥的实验室中为了要确认虚拟机的效率问题所以很多时候需要保持虚拟机在忙碌的状态鸟哥的学生就是丢这只程序进去系统跑 但是将 scale 调高一些那计算就得要花比较多时间用以达到我们需要 CPU 忙碌的状态喔 17.5 script 的执行方式差异 (source, sh script, ./script)
不同的 script 执行方式会造成不一样的结果喔尤其影响 bash 的环境很大呢脚本的执行方式除了前面小节谈到的方式之外还可以利用 source 或小数点 (.) 来执行喔那么这种执行方式有何不同呢当然是不同的啦让我们来说说
利用直接执行的方式来执行 script
当使用前一小节提到的直接指令下达 (不论是绝对路径/相对路径还是 ${PATH} 内)或者是利用bash (或 sh) 来下达脚本时 该 script 都会使用一个新的 bash 环境来执行脚本内的指令也就是说使用这种执行方式时 其实 script 是在子程序的 bash 内执行的我们在前面谈到 export 的功能时曾经就父程序/子程序谈过一些概念性的问题 重点在于『当子程序完成后在子程序内的各项变量或动作将会结束而不会传回到父程序中』 这是什么意思呢
我们举刚刚提到过的 showname.sh 这个脚本来说明好了这个脚本可以让用户自行设定两个变量分别是 firstname 与 lastname想一想如果你直接执行该指令时该指令帮你设定的 firstname 会不会生效看一下底下的执行结果
[dmtsaistudy bin]$ echo ${firstname} ${lastname}确认了这两个变量并不存在喔
[dmtsaistudy bin]$ sh showname.sh
Please input your first name: VBird 这个名字是鸟哥自己输入的
Please input your last name: Tsai
Your full name is: VBird Tsai 看吧在 script 运作中这两个变数有生效
[dmtsaistudy bin]$ echo ${firstname} ${lastname}事实上这两个变量在父程序的 bash 中还是不存在的上面的结果你应该会觉得很奇怪怎么我已经利用 showname.sh 设定好的变量竟然在 bash 环境底下无效怎么回事呢 如果将程序相关性绘制成图的话我们以下图来说明。当你使用直接执行的方法来处理时系统会给予一支新的 bash 让我们来执行 showname.sh 里面的指令因此你的firstname, lastname 等变量其实是在下图中的子程序 bash 内执行的。 当 showname.sh 执行完毕后子程序 bash 内的所有数据便被移除因此上表的练习中在父程序底下 echo ${firstname} 时 就看不到任何东西了这样可以理解吗
利用 source 来执行脚本在父程序中执行
如果你使用 source 来执行指令那就不一样了同样的脚本我们来执行看看
[dmtsaistudy bin]$ source showname.sh
Please input your first name: VBird
Please input your last name: Tsai
Your full name is: VBird Tsai
[dmtsaistudy bin]$ echo ${firstname} ${lastname}
VBird Tsai 嘿嘿有数据产生喔竟然生效了没错啊因为 source 对 script 的执行方式可以使用底下的图示来说明 showname.sh 会在父程序中执行的因此各项动作都会在原本的 bash 内生效这也是为啥你不注销系统而要让某些写入 ~/.bashrc 的设定生效时需要使用『 source ~/.bashrc 』而不能使用『 bash ~/.bashrc 』是一样的啊
该系列目录 -- 【BASH】回顾与知识点梳理目录