⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 0340bashshell-scripts.htm

📁 鸟哥的linux私房菜
💻 HTM
📖 第 1 页 / 共 3 页
字号:
		呵呵!在您写完这个小 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 + -