[摘录备忘]Shell基础

之前用过shell写过点东西,但是不常用,有些语法就会变得陌生。

看到这篇文章觉得不错,遂收藏:http://tiaozhanshu.com/shelllinux.html,部分内容有所删减,如下。

在linux中,我们可以使用gedit,vi,emacs,nano等来编辑shell脚本,每个shell脚本都以开头:

#!/bin/sh    或者     #!/bin/bash

符号#!用来告诉系统执行此脚本所用的程序。

变量赋值和引用

Shell编程中,使用变量无需事先声明,同时变量名的命名须遵循如下规则:

  • 首个字符必须为字母(a-z,A-Z)
  • 中间不能有空格,可以使用下划线(_)
  • 不能使用标点符号
  • 不能使用bash里的关键字(可用help命令查看保留关键字)

要给变量赋值可以写成: 变量名=值

Shell脚本中有许多变量是系统自动设定的,我们将在用到这些变量时再作说明。除了只在脚本内有效的普通shell变量外,还有环境变量,即那些由export关键字处理过的变量。本文不讨论环境变量,因为它们一般只在登录脚本中用到。

shell里的流程控制

if语句

if ....; then
  ....
elif ....; then
  ....
else
  ....
fi

大多数情况下,可以使用测试命令来对条件进行测试,比如可以比较字符串、判断文件是否存在及是否可读等等……通常用” [ ] “来表示条件测试,注意这里的空格很重要,要确保方括号前后的空格。

[ -f "somefile" ] :判断是否是一个文件
[ -x "/bin/ls" ] :判断/bin/ls是否存在并有可执行权限
[ -n "$var" ] :判断$var变量是否有值
[ "$a" = "$b" ] :判断$a和$b是否相等

执行man test可以查看所有测试表达式可以比较和判断的类型。

 

&&和||操作符

熟悉C语言的朋友可能会喜欢下面的表达式:

[ -f "/etc/shadow" ] && echo "This computer uses shadow passwords"

这 里的 && 就是一个快捷操作符,如果左边的表达式为真则执行右边的语句,你也可以把它看作逻辑运算里的与操作。上述脚本表示如果/etc/shadow文件存在,则 打印“This computer uses shadow passwords”。同样shell编程中还可以用或操作(||)。

case语句

case表达式可以用来匹配一个给定的字符串,而不是数字(可别和C语言里的switch…case混淆)。

case ... in
   ...) do something here
esac

select语句

select表达式是bash的一种扩展应用,擅长于交互式场合。用户可以从一组不同的值中进行选择:

select var in ... ; do
 break;
done
.... now $var can be used ....
下面是一个简单的示例:
#!/bin/sh

echo "What is your favourite OS?"
select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do
  break;
done
echo "You have selected $var"

如果 以上脚本运行出现 select :NOT FOUND 将 #!/bin/sh 改为 #!/bin/bash 该脚本的运行结果如下:

What is your favourite OS?
1) Linux
2) Gnu Hurd
3) Free BSD
4) Other
#? 1
You have selected Linux

while/for循环

在shell中,可以使用如下循环:

while ...; do
   ....
done

只要测试表达式条件为真,则while循环将一直运行。关键字”break”用来跳出循环,而关键字”continue”则可以跳过一个循环的余下部分,直接跳到下一次循环中。

for循环会查看一个字符串列表(字符串用空格分隔),并将其赋给一个变量:

for var in ....; do
   ....
done

shell中的一些特殊符号

引号

单引号可以防止任何变量的扩展;

双鱼和可以防止通配符扩展但允许变量扩展;

$$ = PID号

shell把执行此shell进程的PID号存储在参数$$中;

$? : 退出状态

一个进程无论何种原因停止运行,他都要向父进程返回一个退出状态,“$?”存储这上一个命令的退出状态码:

0返回值:命令成功执行;

非0返回值:命令执行失败;

$#

命令行参数个数;

$0~%n

命令行第n个参数;

$*和$@

“$*”将位置参数看成一个参数;

“$@”将位置参数看成多个参数;

例如:

bb1  a  b  c;

set  $*  将a b c看成一个参数;即,$1=a b c;

set  $@将a b c看成三个参数;即,$1=a, $2=b, $3=c

 

shell中的函数

如果你写过比较复杂的脚本,就会发现可能在几个地方使用了相同的代码,这时如果用上函数,会方便很多。函数的大致样子如下:

functionname()
{
# inside the body $1 is the first argument given to the function
# $2 the second ...
body
}

你需要在每个脚本的开始对函数进行声明。

 

命令行参数

我 们已经见过$* 和 $1, $2 … $9 等特殊变量,这些特殊变量包含了用户从命令行输入的参数。迄今为止,我们仅仅了解了一些简单的命令行语法(比如一些强制性的参数和查看帮助的-h选项)。 但是在编写更复杂的程序时,您可能会发现您需要更多的自定义的选项。通常的惯例是在所有可选的参数之前加一个减号,后面再加上参数值 (比如文件名)。

脚本调试

最简单的调试方法当然是使用echo命令。你可以在任何怀疑出错的地方用echo打印变量值,这也是大部分shell程序员花费80%的时间用于调试的原因。Shell脚本的好处在于无需重新编译,而插入一个echo命令也不需要多少时间。

shell也有一个真正的调试模式,如果脚本”strangescript”出错,可以使用如下命令进行调试:

sh -x strangescript

上述命令会执行该脚本,同时显示所有变量的值。

shell还有一个不执行脚本只检查语法的模式,命令如下:

sh -n your_script

这个命令会返回所有语法错误。

转载请注明出处:http://www.cnblogs.com/haochuang/ 8年IT工作经验,5年测试技术与管理,2年产品与项目管理,曾参与过云计算\云存储\车联网产品研发工作; 业余自媒体人,有技术类垂直微信公众号;如有招聘或求职方面需求,请Mail to uetest@qq.com ;或通过 QQ:363573922 微博:@念槐聚 联系;

时间: 2024-11-02 01:54:46

[摘录备忘]Shell基础的相关文章

正则表达式学习摘录-备忘【乱】

PS:之前看<精通正则表达式>部分摘录,只是备忘,不适合阅读!Sorry! #有一定的理论素养,却又始终以实践为本! 正则表达式能够得到众多语言和工具的支持是有原因的: 它们极其有用. 从较低的层面上来说,正则表达式描述的是一串文本( a chunk of text )的特征.我们可以用它来验证用户输入的数据,或者也可以用它来检索大量的文本.从较高的层面上来说,正则表达式容许用户掌控他们自己的数据--控制这些数据,让它们为自己服务.掌握正则表达式,就是掌握自己的数据. 正则表达式(Regula

JDBC事务编程模型备忘

在Spring一统天下的情况下,JDBC快没有生存余地了.不过JDBC还是Java操作数据库的基础,现在Java项目中JDBC的应用快绝迹了,有必要对JDBC的事务编程模型做个象征性的总结. 下面是示例,保证代码可以编译,但不保证能运行,呵呵. import java.sql.*; /** * JDBC编程事务控制模型备忘 * * @author : leizhimin,2008-8-21 14:48:42.<p> */ public class JdbcTxText { public sta

redhat9安装jdk5、ruby和Erlang备忘

   今天费了一个下午安装了redhat9,并且安装了需要使用的jdk5.netbean.ruby和Erlang.做个备忘. 一.安装jdk5 1.到sun的网站上下载jdk5与netbean5.5的捆绑版本,注意要linux平台的 2.比如下载到/root/目录下,执行 chmod 755 jdk-1_5_0_12-nb-5_5_1-linux-ml.bin 然后执行: ./jdk-1_5_0_12-nb-5_5_1-linux-ml.bin 就会自动启动安装向导,一路选择确定下去就OK了.

Express模版引擎hbs备忘

最近几天折腾了下express,想找个合适的模版引擎,下面是一些折腾过程的备忘 选择标准 选择一门模版语言时,可能会考虑的几点 语法友好(micro tmpl那种语法真是够了) 支持模版嵌套(子模版的概念) 支持模版继承(extend) 前后端共用 有容错处理(最好定位到具体出错位置) 支持预编译(性能好) 注意到hbs,似乎满足大部分的需求:https://github.com/donpark/hbs getting started demo地址:https://github.com/chyi

技术备忘3

   shell单引号与变量 [root@test] a=55 [root@test] echo $a 55 [root@test] echo '$a' $a [root@test] echo ''$a'' #注意此处是两个单引不是一个双引 55 总结: 在单引号中引用变量,需要这样来写(单引号括起来双引号内的变量.) :   '"${a}"' 原文地址 date星期求取 <span style="font-family:Microsoft YaHei">

机器学习性能改善备忘单:32个帮你做出更好预测模型的技巧和窍门

机器学习最有价值(实际应用最广)的部分是预测性建模.也就是在历史数据上进行训练,在新数据上做出预测.  而预测性建模的首要问题是: 如何才能得到更好的结果? 这个备忘单基于本人多年的实践,以及我对顶级机器学习专家和大赛优胜者的研究. 有了这份指南,你不但不会再掉进坑里,而且会提升性能,甚至在你自己的一些预测难题中取得世界领先水平的结果. 让我们一起来看看吧! 注意:本文的结构基于早些时候另一篇关于改善深度学习性能的指南--<如何改善深度学习性能>   ◆ ◆ ◆ 概述 本备忘单的目的是为你提供

利用jailkit-2.16.tar.gz + ssh 进行 chroot 操作[备忘]

目标  利用  jaikit 环境, 能够把某个目录虚拟成为 / ,  并且把远程用户限制在该目录中活动,与真正的系统 / 环境进行隔离 利用该环境能够避免开发人员过多地访问系统资源,增加系统安全性     1.      编译jailkit-2.16.tar.gz  ./configure && make && make install   2.      定义 /data作为数据存放区间, 笼环境专用分区 利用 sdb1 挂载 /data chown root:root

平阳在全省率先与支付宝签署“移动智慧城市”建设战略备忘书

出行.医疗.休闲--城市生活.民生服务的每个环节,只需要一部手机,就能冲浪,移动互联网正在悄然改变我们生活的方方面面.日前,平阳县与支付宝(中国)网络技术有限公司签署"移动智慧城市"建设战略备忘书,成为全省首个达成该项战略合作的县,为当地"移动智慧城市"建设迈出了坚实一步. 近年来,平阳抢抓机遇,先后荣获了全国科学发展百强县.全国中小城市最具投资潜力百强县.全国县域经济十大"互联网+"实践县等称号.在高度重视信息化建设下,该县坚持将"互

面向对象的软件分析设计过程备忘

面向对象的软件分析设计过程备忘 一.业务分析与需求收集 1.重点梳理主业务流程,逐步完善分支流程.整理和发现业务流程中的涉众以及他们的业务目标和系统目标,显式目标以及隐式目标: 2.整理涉众们在系统中所承担的角色以及各自的职责: 3.在流程的运转过程中,发现和查找业务实体.他们之间的关系以及关键实体的生命周期(由谁在什么场景下创建.中间状态的变化以致最后的消亡): 4.在流程的运转过程中,有哪些业务规则以及各种隐式的规则: 5.不断的提问和验证流程的正确性和完整性(即使是边界以外的流程也不要放过