我可以问个关于instagram天天向上手帐达人人的问题吗

5个Shell脚本编程入门练习例子
投稿:junjie
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了5个Shell脚本编程入门例子,涵盖了各种操作,又有一些游戏的性质,作为入门练习例子是不很不错的,需要的朋友可以参考下
例子一:绘制特殊图形
#!/bin/bash
echo -n "Enter Number between (5 to 9) : "
&read MAX_NO
if ! [ $MAX_NO -ge 5 -a $MAX_NO -le 9 ] ; then
&echo "WTF... I ask to enter number between 5 and 9, Try Again"
for (( i=1; i=i; s-- ))
&echo -n " "
&for (( j=1; j=1; i-- ))
&for (( s=i; s&=MAX_NO; s++ ))
&echo -n " "
&for (( j=1; j&=i; j++ ))
&echo -n " ."
echo -e "\n\n\t\t\t Whenever you need help,
is always there"
你应该不会被上述例子中的“关键字”困扰了,很多都是你熟悉的,或者从它们的名字可以猜出它们的意思,如“max”设定某个变量的最大值,“for”是一个循环。
输出结果:
[root@tecmint ~]# chmod 755 Special_Pattern.sh
[root@tecmint ~]# ./Special_Pattern.sh
Enter Number between (5 to 9) : 6
&&&& . . .
&&& . . . .
&& . . . . .
& . . . . . .
& . . . . . .
&& . . . . .
&&& . . . .
&&&& . . .
&&&&&&& Whenever you need help,
is always there
如果你有其它语言的编程基础,那么学习上面的脚本对你来说应该很容易。即使你是计算机方面的新手,这个学习过程也不会太难。
例子二:五颜六色的脚本
Linux终端也是支持五颜六色的,请看下面的脚本:
#!/bin/bash
echo -e "\033[1m Hello World"
&# bold effect
echo -e "\033[5m Blink"
&&&&&& # blink effect
echo -e "\033[0m Hello World"
&# back to noraml
echo -e "\033[31m Hello World"
&# Red color
echo -e "\033[32m Hello World"
&# Green color
echo -e "\033[33m Hello World"
&# See remaing on screen
echo -e "\033[34m Hello World"
echo -e "\033[35m Hello World"
echo -e "\033[36m Hello World"
echo -e -n "\033[0m"
& # back to noraml
echo -e "\033[41m Hello World"
echo -e "\033[42m Hello World"
echo -e "\033[43m Hello World"
echo -e "\033[44m Hello World"
echo -e "\033[45m Hello World"
echo -e "\033[46m Hello World"
echo -e "\033[0m Hello World"
输出结果:
你可以对上面的列子举一反三,把它用到你自己的脚本中去。
例子三:加密文件/目录
下面的例子演示了如何加密一个份文件或者文件夹。目前的这个版本的脚本有一些局限,例如你必须把它和你要加密的文件/目录放到同一个文件夹下面。另外,你可能需要安装“pinentry-gui”。在Fedora下安装“pinentry-gui”的命令是:
代码如下:[root@midstage ~]# yum install pinentry-gui
在Ubuntu/Debian下安装“pinentry-gui”的命令是:
代码如下:[root@midstage ~]# apt-get install pinentry-gui
创建一个脚本“Encrypt.sh”,将下面的代码复制进去。你也可以从这里下载这个脚本。
#!/bin/bash
echo "Welcome, I am ready to encrypt a file/folder for you"
echo "currently I have a limitation, Place me to the same folder,
where a file to be encrypted is present"
echo "Enter the Exact File Name with extension"
gpg -c $file
echo "I have encrypted the file sucessfully..."
echo "Now I will be removing the original file"
rm -rf $file
输出结果:
[root@tecmint ~]# chmod 755 Encrypt.sh
[root@tecmint ~]# ./Encrypt.sh
Welcome, I am ready to encrypt a file/folder for you
currently I have a limitation, Place me to the same folder,
where a file to be encrypted is present
Enter the Exact File Name with extension
package.xml
&&&&&&&&&&&&&&&&&& Enter passphrase
&&&&&&&&&&&&&&&&&& Passphrase _________________________________
&&&&&&&&&&&&&&&&&& Please re-enter this passphrase
&&&&&&&&&&&&&&&&&& Passphrase _________________________________
I have encrypted the file successfully...
Now I will be removing the original file
代码说明:
gpg -c: 这个命令使用aka来加密文件。 在你需要的时候,你需要对加密的文件进行解密。这里我们不给出具体的代码了,你可以自己尝试着写出来。提示:使用命令 gpg -d filename.gpg & filename 可以解密一份文件。
例子四:查看服务器利用率
查看服务器的利用率是管理员的一份重要的日常工作。聪明的管理员是知道如何是这份任务自动化的。下面的这份脚本会抓取服务器的很多信息,快快试试吧!
#!/bin/bash
echo "uptime:"
echo "Currently connected:"
echo "--------------------"
echo "Last logins:"
last -a |head -3
echo "--------------------"
echo "Disk and memory usage:"
df -h | xargs | awk '{print "Free/total disk: " $11 " / " $9}'
free -m | xargs | awk '{print "Free/total memory: " $17 " / " $8 " MB"}'
echo "--------------------"
start_log=`head -1 /var/log/messages |cut -c 1-12`
oom=`grep -ci kill /var/log/messages`
echo -n "OOM errors since $start_log :" $oom
echo "--------------------"
echo "Utilization and most expensive processes:"
top -b |head -3
top -b |head -10 |tail -4
echo "--------------------"
echo "Open TCP ports:"
nmap -p- -T4 127.0.0.1
echo "--------------------"
echo "Current connections:"
echo "--------------------"
echo "processes:"
ps auxf --width=200
echo "--------------------"
echo "vmstat:"
vmstat 1 5
输出结果:
[root@tecmint ~]# chmod 755 Server-Health.sh
[root@tecmint ~]# ./Server-Health.sh
Tue Jul 16 22:01:06 IST 2013
22:01:06 up 174 days, 4:42, 1 user, load average: 0.36, 0.25, 0.18
Currently connected:
22:01:06 up 174 days, 4:42, 1 user, load average: 0.36, 0.25, 0.18
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
tecmint pts/0 116.72.134.162 21:48 0.00s 0.03s 0.03s sshd: tecmint [priv]
--------------------
Last logins:
tecmint pts/0 Tue Jul 16 21:48 still logged in 116.72.134.162
tecmint pts/0 Tue Jul 16 21:24 - 21:43 (00:19) 116.72.134.162
--------------------
Disk and memory usage:
Free/total disk: 292G / 457G
Free/total memory: 3510 / 3838 MB
--------------------
OOM errors since Jul 14 03:37 : 0
--------------------
Utilization and most expensive processes:
top - 22:01:07 up 174 days, 4:42, 1 user, load average: 0.36, 0.25, 0.18
Tasks: 149 total, 1 running, 148 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.1%us, 0.0%sy, 0.0%ni, 99.3%id, 0.6%wa, 0.0%hi, 0.0%si, 0.0%st
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 2 S 0.0 0.0 0:32.94 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root RT 0 0 0 0 S 0.0 0.0 0:14.07 migration/0
例子五:查看硬盘使用情况及发送提示邮件
下面的这个例子展示了当硬盘的使用空间超出了预期设定的值时,如果通过脚本来发送提示邮件。
代码如下:MAX=95
EMAIL=server@127.0.0.1
USE=`df -h |grep $PART | awk '{ print $5 }' | cut -d'%' -f1`
if [ $USE -gt $MAX ]; then
echo "Percent used: $USE" | mail -s "Running out of disk space" $EMAIL
说明:将上述脚本中的“USER”替换成你的用户名。你可以通过命令“mail”来查看你的邮件。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具Linux 教程
Shell 教程
Shell 是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Ken Thompson的sh是第一种Unix Shell,Windows Explorer是一个典型的图形界面Shell。
Shell 脚本
Shell 脚本(shell script),是一种为shell编写的脚本程序。
业界所说的shell通常都是指shell脚本,但读者朋友要知道,shell和shell script是两个不同的概念。
由于习惯的原因,简洁起见,本文出现的"shell编程"都是指shell脚本编程,不是指开发shell自身。
Shell 环境
Shell 编程跟java、php编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
Linux的Shell种类众多,常见的有:
Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)C Shell(/usr/bin/csh)K Shell(/usr/bin/ksh)Shell for Root(/sbin/sh)……
本教程关注的是 Bash,也就是 Bourne Again Shell,由于易用和免费,Bash在日常工作中被广泛使用。同时,Bash也是大多数Linux系统默认的Shell。
在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为#!/bin/bash。
#!告诉系统其后路径所指定的程序即是解释此脚本文件的Shell程序。
第一个shell脚本
打开文本编辑器(可以使用vi/vim命令来创建文件),新建一个文件test.sh,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用php写shell 脚本,扩展名就用php好了。
输入一些代码,第一行一般是这样:
#!/bin/bash
echo "Hello World !"
"#!" 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell。
echo命令用于向窗口输出文本。
运行Shell脚本有两种方法:
1、作为可执行程序
将上面的代码保存为test.sh,并cd到相应目录:
chmod +x ./test.sh
#使脚本具有执行权限
注意,一定要写成./test.sh,而不是test.sh,运行其它二进制的程序也一样,直接写test.sh,linux系统会去PATH里寻找有没有叫test.sh的,而只有/bin, /sbin, /usr/bin,/usr/sbin等在PATH里,你的当前目录通常不在PATH里,所以写成test.sh是会找不到命令的,要用./test.sh告诉系统说,就在当前目录找。
2、作为解释器参数
这种运行方式是,直接运行解释器,其参数就是shell脚本的文件名,如:
/bin/sh test.sh
/bin/php test.php
这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。
3周前 (03-12)
反馈内容(*必填)
截图标记颜色
联系方式(邮箱)
联系邮箱:
投稿页面:
记住登录状态
重复输入密码编写可靠shell脚本的8个建议
作者:51cto
这八个建议,来源于键者几年来编写 shell
脚本的一些经验和教训。事实上开始写的时候还不止这几条,后来思索再三,去掉几条无关痛痒的,最后剩下八条。毫不夸张地说,每条都是精挑细选的,虽然有几点算是老生常谈了。
1. 指定bash
shell 脚本的第一行,#!之后应该是什么?如果拿这个问题去问别人,不同的人的回答可能各不相同。
我见过/usr/bin/env bash,也见过/bin/bash,还有/usr/bin/bash,还有/bin/sh,还有/usr/bin/env
sh。这算是编程界的&'茴'字四种写法&了。
在多数情况下,以上五种写法都是等价的。但是,写过程序的人都知道:&少数情况&里往往隐藏着意想不到的坑。
如果系统的默认 shell 不是 bash 怎么办?比如某 Linux 发行版的某个版本,默认的 sh 就不是 bash。
如果系统的 bash 不是在 /usr/bin/bash 怎么办?
我推荐使用 /usr/bin/env bash 和
/bin/bash。前者通过env添加一个中间层,让env在$PATH中搜索后者则是官方背书的,约定俗成的 bash
位置,/usr/bin/bash不过是指向它的一个符号链接。
2. set -e 和 set -x
OK,经过一番讨论,现在第一行定下来了。接下来该开始写第二行了吧?
且慢!在你开始构思并写下具体的代码逻辑之前,先插入一行set -e和一行set -x。
set -x会在执行每一行 shell 脚本时,把执行的内容输出来。它可以让你看到当前执行的情况,里面涉及的变量也会被替换成实际的值。
set -e会在执行出错时结束程序,就像其他语言中的&抛出异常&一样。(准确说,不是所有出错的时候都会结束程序,见下面的注)
注:set -e结束程序的条件比较复杂,在man bash里面,足足用了一段话描述各种情景。大多数执行都会在出错时退出,除非 shell
命令位于以下情况:
一个 pipeline 的非结尾部分,比如 error | ok
一个组合语句的非结尾部分,比如 ok && error || other
一连串语句的非结尾部分,比如 ok
位于判断语句内,包括test、if、while等等。
这两个组合在一起用,可以在 debug
的时候替你节省许多时间。出于防御性编程的考虑,有必要在写第一行具体的代码之前就插入它们。扪心自问,写代码的时候能够一次写对的次数有多少?大多数代码,在提交之前,通常都经历过反复调试修改的过程。与其在焦头烂额之际才引入这两个配置,不如一开始就给
debug 留下余地。在代码终于可以提交之后,再考虑是否保留它们也不迟。
3. 带上shellcheck
好了,现在我已经有了三行(样板)代码,具体的业务逻辑一行都没写呢。是不是该开始写了?
且慢!工欲善其事,必先利其器。这次,我就介绍一个 shell 脚本编写神器:shellcheck
说来惭愧,虽然写了几年 shell 脚本,有些语法我还是记不清楚。这时候就要依仗 shellcheck 指点一下了。shellcheck
除了可以提醒语法问题以外,还能检查出 shell 脚本编写常见的 bad code。本来我的N条建议里面,还有几条是关于这些 bad code 的,不过考虑到
shellcheck 完全可以发掘出这些问题,于是忍痛把它们都剔除在外了。毫无疑问,使用 shellcheck 给我的 shell
编写技能带来了巨大的飞跃。
所谓&站在巨人的肩膀上&,虽然我们这些新兵蛋子,技能不如老兵们强,但是我们可以在装备上赶上对方啊!动动手安装一下,就能结识一个循循善诱的&老师&,何乐而不为?
顺便一提,shellcheck 居然是用 haskell 写的。谁说 haskell 只能用来装逼?
4. 变量展开
在 shell 脚本中,偶尔可以看到这样的做法:echo $xxx | awk/sed/grep/cut...
。看起来大张形势的样子,其实不过是想修改一个变量的值。杀鸡何必用牛刀?bash内建的变量展开机制已经足以满足你各种需求!还是老方法, read the f**k
manaul! man bash 然后搜索Parameter
Expansion,下面就是你想要的技巧。键者也写过一篇相关的文章,希望能助上一臂之力:玩转Bash变量
5. 注意local
随着代码越写越多,你开始把重复的逻辑提炼成函数。有可能你会掉到bash的一个坑里。在bash,如果不加 local
限定词,变量默认都是全局的。变量默认全局&&这跟 js 和 lua 相似;但相较而言,很少有 bash
教程一开始就告知你这个事实。在顶级作用域里,是否是全局变量并不重要。但是在函数里面,声明一个全局变量可能会污染到其他作用域(尤其在你根本没有注意到这一点的情况下)。所以,对于在函数内声明的变量,请务必记得加上
local 限定词。
6. trap信号
如果你写过稍微复杂点的在后台运行的程序,应该知道 posix 标准里面&信号&是什么一回事。如果不知道,直接看下一段。像其他语言一样,shell
也支持处理信号。trap sighandler INT可以在接收到 SIGINT 时调用 sighandler 函数。捕获其他信号的方式以此类推。
不过 trap 的主要应用场景可不是捕获哪个信号。trap
命令支持&捕获&许多不同的流程&&准确来说,允许用户给特定的流程注入函数调用。其中最为常用的是trap func EXIT和trap func ERR。
EXIT允许在脚本结束时调用函数。由于无论正常退出抑或异常退出,所注册的函数都能得以调用,在需要调用一个清理函数的场景下,我都是用它注册清理函数,而不是简单地在脚本结尾调用清理函数。
ERR允许在运行出错时调用函数。一个常用的技法是,使用全局变量ERROR存储错误信息,然后在注册的函数中根据存储的值完成对应的错误报告。把原本四分五裂的错误处理逻辑集中到一处,有时候会起奇效。不过要记住,程序异常退出时,既会调用EXIT注册的函数,也会调用ERR注册的函数。
7. 三思后行
以上几条都是具体的建议,剩下两条比较务虚。
这条建议的名字叫&三思而行&。其实无论写什么代码,哪怕只是一个辅助脚本,都要三思而行,切忌粗心大意。不,写脚本的时候更要记住这点。毕竟许多时候,一个复杂的脚本发端于几行小小的命令。一开始写这个脚本的人,也许以为它只是一次性任务。代码里难免对一些外部条件有些假定,在当时也许是正常的,但是随着外部环境的变化,这些就成了隐藏的暗礁。雪上加霜的是,几乎没有人会给脚本做测试。除非你去运行它,否则不知道它是否还能正常使用。
要想减缓脚本代码的腐烂速度,需要在编写的时候辨清哪些是会变的依赖、哪些是脚本正常运行所不可或缺的。要有适当的抽象,编写可变更的代码;同时要有防御性编程的意识,给自己的代码一道护城河。
8. 扬长避短
有些时候,使用 shell 写脚本就意味着难以移植、难以统一地进行错误处理、难以利索地处理数据。
虽然使用外部的命令可以方便快捷地实现各种复杂的功能,但作为硬币的反面,不得不依靠grep、sed、awk等各种工具把它们粘合在一起。
如果有兼容多平台的需求,还得小心规避诸如BSD和GNU coreutils,bash版本差异之类奇奇怪怪的陷阱。
由于缺乏完善的数据结构以及一致的API,shell 脚本在处理复杂的逻辑上力不从心。
解决特定的问题要用合适的工具。知道什么时候用 shell,什么时候切换到另外一门更通用的脚本语言(比如ruby/python/perl),这也是编写可靠
shell 脚本的诀窍。如果你的任务可以组合常见的命令来完成,而且只涉及简单的数据,那么 shell
脚本就是适合的锤子。如果你的任务包含较为复杂的逻辑,而且数据结构复杂,那么你需要用ruby/python之类的语言编写脚本。
官方微博/微信
每日头条、业界资讯、热点资讯、八卦爆料,全天跟踪微博播报。各种爆料、内幕、花边、资讯一网打尽。百万互联网粉丝互动参与,TechWeb官方微博期待您的关注。
↑扫描二维码
想在手机上看科技资讯和科技八卦吗?想第一时间看独家爆料和深度报道吗?请关注TechWeb官方微信公众帐号:1.用手机扫左侧二维码;2.在添加朋友里,搜索关注TechWeb。
9.7英寸的iPad Pro上,苹果带来了一个很有用的功能,那就是屏幕支持True Tone功能,简...
雷军昨晚确认,小米6定于4月发布。按照此前小米官微的说法,他们将在国内首发骁龙835...
三星前不久刚刚公布了S8手机,这款手机应该是今年Android平台目前最强大的产品,不过...
据路透社北京时间4月1日报道,在运营成本降低近一半后,黑莓公司第四财季亏损额好于预...
北京时间4月1日早间消息,大数据软件公司Cloudera周五向纽交所提交IPO招股书,计划融...
富士康发布了2016年第四季度及全年业绩。第四季度,富士康净利润同比增长30%,超出了...
与优酷合并多时的土豆网今天公布了全新的LOGO标识,从“笑脸”图案变成了“亲亲嘴”,...
支付宝旗下理财产品余额宝正受到越来越多尝试理财的用户的青睐,其收益也是越来越高,...
Windows 10的第四次重大更新就要来了,微软已经明确4月11日推送它。现在,微软再次发...
《Legacy of Discord - Furious Wings》(简称LOD)海外上线不足半年,已获得691次App......
火影忍者手游三代火影可以通过组织争霸赛获得碎片,三次跨服第一并且组织捐赠的小伙伴......
王者荣耀体验服3月27日更新,老夫子重做之后上线了,下面为大家介绍新版老夫子的详细......
夜雾迷城活动2月22日5:00—2月28日23:59,本次活动新增套装黎明之冠新月之吻,下面为......
Copyright (C)
All rights reserved.
请选择一张图片分享
要转发到新浪微博,请
要转发到QQ空间,请什么是Shell脚本
看个例子吧:
mkdir shell_tut
cd shell_tut
for ((i=0; i&10; i++)); do
touch test_$i.txt
第1行:指定脚本解释器,这里是用/bin/sh做解释器的
第2行:切换到当前用户的home目录
第3行:创建一个目录shell_tut
第4行:切换到shell_tut目录
第5行:循环条件,一共循环10次
第6行:创建一个test_1…10.txt文件
第7行:循环体结束
cd, mkdir, touch都是系统自带的程序,一般在/bin或者/usr/bin目录下。for, do, done是sh脚本语言的关键字。
shell和shell脚本的概念
shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Ken Thompson的sh是第一种Unix Shell,Windows Explorer是一个典型的图形界面Shell。
shell脚本(shell script),是一种为shell编写的脚本程序。业界所说的shell通常都是指shell脚本,但读者朋友要知道,shell和shell script是两个不同的概念。由于习惯的原因,简洁起见,本文出现的“shell编程”都是指shell脚本编程,不是指开发shell自身(如Windows Explorer扩展开发)。
shell编程跟java、php编程一样,只要有一个能编写代码的和一个能解释执行的脚本解释器就可以了。
当前主流的操作系统都支持shell编程,本文档所述的shell编程是指Linux下的shell,讲的基本都是POSIX标准下的功能,所以,也适用于Unix及BSD(如Mac OS)。
Linux默认安装就带了shell解释器。
Mac OS不仅带了sh、bash这两个最基础的解释器,还内置了ksh、csh、zsh等不常用的解释器。
Windows上的模拟器
windows出厂时没有内置shell解释器,需要自行安装,为了同时能用grep, awk, curl等工具,最好装一个cygwin或者mingw来模拟linux环境。
脚本解释器
即Bourne shell,POSIX(Portable Operating System Interface)标准的shell解释器,它的二进制文件路径通常是/bin/sh,由Bell Labs开发。
本文讲的是sh,如果你使用其它语言用作shell编程,请自行参考相应语言的文档。
Bash是Bourne shell的替代品,属GNU Project,二进制文件路径通常是/bin/bash。业界通常混用bash、sh、和shell,比如你会经常在招聘运维工程师的文案中见到:熟悉Linux Bash编程,精通Shell编程。
在CentOS里,/bin/sh是一个指向/bin/bash的符号链接:
[root@centosraw ~]# ls -l /bin/*sh
-rwxr-xr-x. 1 root root 903272 Feb 22 05:09 /bin/bash
-rwxr-xr-x. 1 root root 106216 Oct 17
2012 /bin/dash
lrwxrwxrwx. 1 root root
4 Mar 22 10:22 /bin/sh -& bash
但在Mac OS上不是,/bin/sh和/bin/bash是两个不同的文件,尽管它们的大小只相差100字节左右:
iMac:~ wuxiao$ ls -l /bin/*sh
-r-xr-xr-x
Nov 16:52 /bin/bash
-rwxr-xr-x
Nov 16:52 /bin/csh
-r-xr-xr-x
Nov 16:52 /bin/ksh
-r-xr-xr-x
Nov 16:52 /bin/sh
-rwxr-xr-x
Nov 16:52 /bin/tcsh
-rwxr-xr-x
Nov 16:52 /bin/zsh
高级编程语言
理论上讲,只要一门语言提供了解释器(而不仅是编译器),这门语言就可以胜任脚本编程,常见的解释型语言都是可以用作脚本编程的,如:Perl、Tcl、Python、PHP、Ruby。Perl是最老牌的脚本编程语言了,Python这些年也成了一些linux发行版的预置解释器。
编译型语言,只要有解释器,也可以用作脚本编程,如C shell是内置的(/bin/csh),Java有第三方解释器Jshell,Ada有收费的解释器AdaScript。
如下是一个PHP Shell Script示例(假设文件名叫test.php):
#!/usr/bin/php
for ($i=0; $i & 10; $i++)
echo $i . "\n";
/usr/bin/php test.php
chmod +x test.php
./test.php
如何选择shell编程语言
熟悉 vs 陌生
如果你已经掌握了一门编程语言(如PHP、Python、Java、JavaScript),建议你就直接使用这门语言编写脚本程序,虽然某些地方会有点啰嗦,但你能利用在这门语言领域里的经验(单元测试、单步调试、IDE、第三方类库)。
新增的学习成本很小,只要学会怎么使用shell解释器(Jshell、AdaScript)就可以了。
简单 vs 高级
如果你觉得自己熟悉的语言(如Java、C)写shell脚本实在太啰嗦,你只是想做一些备份文件、安装软件、下载数据之类的事情,学着使用sh,bash会是一个好主意。
shell只定义了一个非常简单的编程语言,所以,如果你的脚本程序复杂度较高,或者要操作的数据结构比较复杂,那么还是应该使用Python、Perl这样的脚本语言,或者是你本来就已经很擅长的高级语言。因为sh和bash在这方面很弱,比如说:
它的函数只能返回字串,无法返回数组
它不支持面向对象,你无法实现一些优雅的
它是解释型的,一边解释一边执行,连PHP那种预编译都不是,如果你的脚本包含错误(例如调用了不存在的函数),只要没执行到这一行,就不会报错
环境兼容性
如果你的脚本是提供给别的用户使用,使用sh或者bash,你的脚本将具有最好的环境兼容性,perl很早就是linux标配了,python这些年也成了一些linux发行版的标配,至于mac os,它默认安装了perl、python、ruby、php、java等主流编程语言。
第一个shell脚本
打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用php写shell 脚本,扩展名就用php好了。
输入一些代码,第一行一般是这样:
#!/bin/bash
#!/usr/bin/php
“#!”是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行。
运行Shell脚本有两种方法:
作为可执行程序
chmod +x test.sh
注意,一定要写成./test.sh,而不是test.sh,运行其它二进制的程序也一样,直接写test.sh,linux系统会去PATH里寻找有没有叫test.sh的,而只有/bin, /sbin, /usr/bin,/usr/sbin等在PATH里,你的当前目录通常不在PATH里,所以写成test.sh是会找不到命令的,要用./test.sh告诉系统说,就在当前目录找。
通过这种方式运行bash脚本,第一行一定要写对,好让系统查找到正确的解释器。
这里的”系统”,其实就是shell这个应用程序(想象一下Windows Explorer),但我故意写成系统,是方便理解,既然这个系统就是指shell,那么一个使用/bin/sh作为解释器的脚本是不是可以省去第一行呢?是的。
作为解释器参数
这种运行方式是,直接运行解释器,其参数就是shell脚本的文件名,如:
/bin/sh test.sh
/bin/php test.php
这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。
定义变量时,变量名不加美元符号($),如:
your_name="qinjx"
注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。
除了显式地直接赋值,还可以用语句给变量赋值,如:
for file in `ls /etc`
使用一个定义过的变量,只要在变量名前面加美元符号即可,如:
your_name="qinjx"
echo $your_name
echo ${your_name}
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:
for skill in Ada Coffe Action J do
echo "I am good at ${skill}Script"
如果不给skill变量加花括号,写成echo “I am good at $skillScript”,解释器就会把$skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。
推荐给所有变量加上花括号,这是个好的编程习惯。IntelliJ IDEA编写shell script时,IDE就会提示加花括号。
重定义变量
已定义的变量,可以被重新定义,如:
your_name="qinjx"
echo $your_name
your_name="alibaba"
echo $your_name
这样写是合法的,但注意,第二次赋值的时候不能写$your_name=”alibaba”,使用变量的时候才加美元符。
以“#”开头的行就是注释,会被解释器忽略。
sh里没有多行注释,只能每一行加一个#号。就像这样:
#--------------------------------------------
# 这是一个自动打ipa的脚本,基于webfrogs的ipa-build书写:/webfrogs/xcode_shell/blob/master/ipa-build
# 功能:自动为etao ios app打包,产出物为14个渠道的ipa包
# 特色:全自动打包,不需要输入任何参数
#--------------------------------------------
##### 用户配置区 开始 #####
# 项目根目录,推荐将此脚本放在项目的根目录,这里就不用改了
# 应用名,确保和Xcode里Product下的target_name.app名字一致
##### 用户配置区 结束
如果在开发过程中,遇到大段的代码需要临时注释起来,过一会儿又取消注释,怎么办呢?每一行加个#符号太费力了,可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。
字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了,哈哈),字符串可以用单引号,也可以用双引号,也可以不用引号。单双引号的区别跟PHP类似。
str='this is a string'
单引号字符串的限制:
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
单引号字串中不能出现单引号(对单引号使用转义符后也不行)
your_name='qinjx'
str="Hello, I know your are \"$your_name\"! \n"
双引号里可以有变量
双引号里可以出现转义字符
字符串操作
拼接字符串
your_name="qinjx"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
获取字符串长度:
string="abcd"
echo ${#string} #输出:4
提取子字符串
string="alibaba is a great company"
echo ${string:1:4} #输出:liba
查找子字符串
string="alibaba is a great company"
echo `expr index "$string" is`#输出:8,这个语句的意思是:找出单词is在这名话中的位置
和Java、PHP等语言不一样,sh的流程控制不可为空,如:
if (isset($_GET["q"])) {
search(q);
//do nothing
在sh/bash里可不能这么写,如果else分支没有语句执行,就不要写这个else。
还要注意,sh里的if [ $foo -eq 0 ],这个方括号跟Java/PHP里if后面的圆括号大不相同,它是一个可执行程序(和cd, ls, grep一样),想不到吧?在CentOS上,它在/usr/bin目录下:
ll /usr/bin/[
-rwxr-xr-x. 1 root root 33408 6月
22 2012 /usr/bin/[
正因为方括号在这里是一个可执行程序,方括号后面必须加空格,不能写成if [$foo -eq 0]
if condition
写成一行(适用于终端命令提示符):
if `ps -ef | grep ssh`; fi
末尾的fi就是if倒过来拼写,后面还会遇到类似的
if condition
if else-if else
if condition1
elif condition2
在开篇的示例里演示过了:
for var in item1 item2 ... itemN
写成一行:
for var in item1 item2 ... itemN; do command1; command2…
C风格的for
for (( EXP1; EXP2; EXP3 ))
while condition
while true
for (( ; ; ))
until condition
case "${opt}" in
"Install-Puppet-Server" )
install_master $1
"Install-Puppet-Client" )
install_client $1
"Config-Puppet-Server" )
config_puppet_master
"Config-Puppet-Client" )
config_puppet_client
* ) echo "Bad option, please choose again"
case的语法和C family语言差别很大,它需要一个esac(就是case反过来)作为结束标记,每个case分支用右圆括号,用两个分号表示break
可以使用source和.关键字,如:
source ./function.sh
. ./function.sh
在bash里,source和.是等效的,他们都是读入function.sh的内容并执行其内容(类似PHP里的include),为了更好的可移植性,推荐使用第二种写法。
包含一个文件和执行一个文件一样,也要写这个文件的路径,不能光写文件名,比如上述例子中:
. ./function.sh
不可以写作:
. function.sh
如果function.sh是用户传入的参数,如何获得它的绝对路径呢?方法是:
real_path=`readlink -f $1`#$1是用户输入的参数,如function.sh
. $real_path
执行脚本时传入
脚本运行中输入
select菜单
stdin和stdout
常用的命令
sh脚本结合系统命令便有了强大的威力,在字符处理领域,有grep、awk、sed三剑客,grep负责找出特定的行,awk能将行拆分成多个字段,sed则可以实现更新插入删除等写操作。
查看进程列表
排除grep自身
查找与target相邻的结果
在文章中找不到问题答案?您还可以
热门栏目订阅}

我要回帖

更多关于 手帐达人胡睿芯微博 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信