📄 0340bashshell-scripts.htm
字号:
呵呵!在您写完这个小 script 之后,您就可以大声的说∶『我也会写程式了』!哈哈!
很简单有趣吧~ ^_^<br><br>
另外,你也可以利用∶『chmod a+x sh01.sh; ./sh01.sh』来执行这个 script 的呢!<br>
</div>
</div>
<hr><a name="script_be"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class=text_h2>撰写 shell script 的良好习惯建立</span><br>
<div class=block2>
一个良好习惯的养成是很重要的~大家在刚开始撰写程式的时候,最容易忽略这部分,
认为程式写出来就好了,其他的不重要。其实,如果程式的说明能够更清楚,
那么对您自己是有很大的帮助的。<br><br>
举例来说,鸟哥自己为了自己的需求,曾经撰写了不少的 script 来帮我进行主机 IP 的侦测啊、
登录档分析与管理啊、自动上传下载重要设定档啊等等的,不过,早期就是因为太懒了,
管理的主机又太多了,常常同一个程式在不同的主机上面进行更改,到最后,到底哪一支才是最新的都记不起来,
而且,重点是,我到底是改了哪里??为什么做那样的修改?都忘的一乾二净~真要命~<br><br>
所以,后来鸟哥在写程式的时候,通常会比较仔细的将程式的设计过程给他记录下来,
而且还会记录一些历史纪录,如此一来,好多了~
至少很容易知道我修改了哪些资料,以及程式修改的理念与逻辑概念等等,
在维护上面是轻松很多很多的喔!<br><br>
另外,在一些环境的设定上面,毕竟每个人的环境都不相同,为了取得较佳的执行环境,
我都会自行先定义好一些一定会被用到的环境变数,例如 PATH 这个玩意儿!
这样比较好啦~所以说,建议您一定要养成良好的 script 撰写习惯,
在每个 script 的档头处记录好∶<ul><span class=text_import2>
<li>script 的功能;
<li>script 的版本资讯;
<li>script 的作者与联络方式;
<li>script 的版权宣告方式;
<li>script 的 History (历史纪录);
<li>script 内较特殊的指令,使用绝对路径的方式来下达;
<li>script 运作时需要的环境变数预先宣告与设定。</ul></span>
</div>
</div>
<hr><a NAME="some_ex"></a><img src="images/penguin-m.gif" alt="大标题的图示" height="34" width="25" align="middle" /><span class="text_h1">简单的 shell script 练习</span><br>
<div class=block1>
在第一支 shell script 撰写完毕之后,相信您应该具有基本的撰写功力了。
接下来,在开始更深入的程式概念之前,我们先来玩一些比较有趣的简单的小范例好了。
底下的范例中,达成结果的方式相当的多,建议您先自行撰写看看,写完之后再与鸟哥写的内容比对,
这样才能更加深概念喔!好!不棉唆,我们就一个一个来玩吧!<br><br>
<hr><li><span class=text_import1>变数内容由使用者决定</span></li>
<div class=block2>
很多时候我们需要使用者输入一些内容,好让程式可以顺利运作。
简单的来说,大家应该都有安装过软体的经验,安装的时候,他不是会问您『要安装到那个目录去?』吗?
那个让使用者输入的资料的动作,就是让使用者输入变数内容啦。<br><br>
你应该还记得在 <a href="0320bash.php">bash</a> 的时候,我们有学到一个
<a href="0320bash.php#read">read</a> 指令吧?忘记的话,请自行回头去阅读一番。
现在,请你以 read 指令的用途,撰写一个 script ,他可以让使用者输入∶1 first name 与 2. last name,
最后并且在萤幕上显示∶『Your full name is: 』的内容∶<br>
<table class="term"><tr><td class="term"><pre>
[root@linux scripts]# <span class=term_command>vi sh02.sh</span>
<span class=term_write>#!/bin/bash
# Program:
# Let user keyin their first and last name, and show their full name.
# History:
# 2005/08/23 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
read -p "Please input your last name: " lastname
echo -e "\nYour full name is: $firstname $lastname"</span>
</pre></td></tr></table>
将上面这个 sh02.sh 执行一下,你就能够发现使用者自己输入的变数可以被取用的哩!
很不错吧!加油!<br><br>
</div>
<hr><li><span class=text_import1>利用 date 进行档案的建立</span></li>
<div class=block2>
想像一个状况,如果我每天要进行备份,而备份的资料又不想被覆盖掉,也就是说,
我想要将每天备份的资料放在不同的档案中。哇!这真困扰啊?难道要我每天去修改 script ?
不需要啊!因为每天的『日期』并不相同,所以我可以将档名取成类似∶ backup.20050802 ,
不就可以每天一个不同档名了吗?呵呵!确实如此。好了,接下来出个例子∶
我想要建立三个空的档案,档名最开头由使用者输入决定,假设使用者输入 filename 好了,
那今天的日期是 2005/08/23 ,我想要以前天、昨天、今天的日期来建立这个档案,亦即
filename_20050821, filename_20050822, filename_20050823 ,该如何是好?<br>
<table class="term"><tr><td class="term"><pre>
[root@linux scripts]# <span class=term_command>vi sh03.sh</span>
<span class=term_write>#!/bin/bash
# Program:
# User can keyin filename to touch 3 new files.
# History:
# 2005/08/23 VBird First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
<span class=term_say># 1. 让使用者输入档案名称,并取得 fileuser 这个变数;</span>
echo -e "I will use 'touch' command to create 3 files."
read -p "Please input the filename what you want: " fileuser
<span class=term_say># 2. 为了避免使用者随意按 Enter ,利用变数功能分析档名是否有设定?</span>
filename=${fileuser:-"filename"}
<span class=term_say># 3. 开始利用 date 指令来取得所需要的档名了;</span>
date1=`date --date='2 days ago' +%Y%m%d`
date2=`date --date='1 days ago' +%Y%m%d`
date3=`date +%Y%m%d`
file1="$filename""$date1"
file2="$filename""$date2"
file3="$filename""$date3"
<span class=term_say># 4. 将档名建立吧!</span>
touch $file1
touch $file2
touch $file3</span>
</pre></td></tr></table>
我透过一些简单的动作,这些动作都可以在 bash 那一章里面找到,
包括小指令 (`) 的取得讯息、变数的设定功能、变数的累加以及利用 touch 指令辅助!
如果您开始执行这个 sh03.sh 之后,你可以进行两次输入,一次直接按 [Enter] 来查阅档名是啥?
一次可以输入一些字元,这样来判断你的档案喔!关于 date 的指令应用,请 man date 吧! ^_^<br><br>
</div>
<hr><li><span class=text_import1>数值运算的方法</span></li>
<div class=block2>
各位看官应该还记得,我们可以使用 declare 来定义变数的类型吧?!
这样才能够进行加减运算啊!可惜的是, bash shell 里头预设仅支援到整数的资料。
OK!那我们来玩玩看,如果我们要使用者输入两个变数,然后将两个变数的内容相乘,
最后输出相乘的结果,那可以怎么做?<br>
<table class="term"><tr><td class="term"><pre>
[root@linux scripts]# <span class=term_command>vi sh04.sh</span>
<span class=term_write>#!/bin/bash
# Program:
# User can input 2 integer to cross by!
# History:
# 2005/08/23 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 number, I will cross they! \n"
read -p "first number: " firstnu
read -p "second number: " secnu
total=$(($firstnu*$secnu))
echo -e "\nThe number $firstnu x $secnu is ==> $total"</span>
</pre></td></tr></table>
在数字的运算上,我们可以使用『 <span class=text_import2>declare -i total=$firstnu*$secnu</span> 』
也可以使用上面的方式来进行!基本上,鸟哥比较建议使用这样的方式来进行运算∶
<ul><span class=text_import2>var=$((运算内容))</ul></span>
不但容易记忆,而且也比较方便的多~未来您可以使用这种方式来计算的呀!至于数值运算上的处理,
则有∶<span class=text_import2><font face="细明体">+, -, *, /, %</font></span>等等。
那个 % 是取馀数啦~举例来说, 13 对 3 取馀数,结果是 13=4*3+1,所以馀数是 1 啊!就是∶<br>
<table class="term"><tr><td class="term"><pre>
[root@linux scripts]# <span class=term_command>nu=$((13%3)); echo $nu</span>
1
</pre></td></tr></table>
这样了解了吧?!多多学习与应用喔! ^_^<br>
</div>
</div>
<hr><a NAME="dis"></a><img src="images/penguin-m.gif" alt="大标题的图示" height="34" width="25" align="middle" /><span class="text_h1">善用判断式</span><br>
<div class=block1>
在 <a href="0320bash.php">bash</a> 章节中,我们提到过 $? 这个变数所代表的意义,
此外,也透过 && 及 || 来作为前一个指令是否能够成功进行的一个参考。
那么,如果我想要知道 /dmtsai 这个目录是否存在时,难道一定要使用 ls 来执行,
然后再以 $? 来判断执行成果吗?呵呵!当然不需要!
我们可以透过『 test 』这个指令来侦测呢!<br><br>
<hr><a name="test"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class=text_h2>利用 test 指令的测试功能</span><br>
<div class=block2>
当我要检测系统上面某些档案或者是相关的属性时,利用 test 这个指令来工作,
真是好用得不得了,举例来说,我要检查 /dmtsai 是否存在时,使用∶<br>
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>test -e /dmtsai</span>
</pre></td></tr></table>
执行结果并不会显示任何讯息,但最后我们可以透过 $? 或 && 及 || 来展现整个结果呢!
例如我们在将上面的例子改写成这样∶<br>
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>test -e /dmtsai && echo "exist" || echo "Not exist"</span>
</pre></td></tr></table>
最终的结果可以告知我们是『exist』还是『Not exist』呢!那我知道 -e 是测试一个『东西』在不在,
如果还想要测试一下该档名是啥玩意儿时,还有哪些标
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -