介绍: 1 开头

程序必须以下面的行开始(必须方在文件的第一行):

#!/bin/sh

符号#!用来告诉系统它后面的参数是用来执行该文件的程序。

在这个例子中我们使用/bin/sh来执行程序。 当编写脚本完成时,如果要执行该脚本,还必须使其可执行。 要使编写脚本可执行:

编译 chmod +x filename 这样才能用./filename 来运行

2 注释

在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。

我们真诚地建议您在程序中使用注释。 如果您使用了注释,那么即使相当长的时间内没有使用该脚本,您也能在很短的时间内明白该脚本的作用及工作原理。

3 变量

在其他编程语言中您必须使用变量。在shell编程中,所有的变量都由字符串组成,并且您不需要对变量进行声明。

要赋值给一个变量,您可以这样写:

#!/bin/sh

#对变量赋值:

a=”hello world”

# 现在打印变量a的内容:

echo “A is:”

echo $a

有时候变量名很容易与其他文字混淆,比如:

num=2

echo “this is the $numnd

这并不会打印出”this is the 2nd”,而仅仅打印”this is the “,因为shell会去搜索变量numnd的值,但是这个变量时没有值的。可以使用花括号来告诉shell我们要打印的是num变量:

num=2 echo “this is the ${num}nd”

这将打印: this is the 2nd

4 环境变量

由export关键字处理过的变量叫做环境变量。

我们不对环境变量进行讨论,因为通常情况下仅仅在登录脚本中使用环境变量。

5 Shell命令和流程控制

在shell脚本中可以使用三类命令:

1) Unix 命令:

  虽然在shell脚本中可以使用任意的unix命令,但是还是由一些相对更常用的命令。这些命令通常是用来进行文件和文字操作的。

     常用命令语法及功能

     echo “some text”: 将文字内容打印在屏幕上

     ls: 文件列表

    wc –l filewc -w filewc -c file: 计算文件行数计算文件中的单词数计算文件中的字符数

    cp sourcefile destfile: 文件拷贝

    mv oldname newname : 重命名文件或移动文件

    rm file: 删除文件

    grep ‘pattern’ file: 在文件内搜索字符串比如:grep ’searchstring’ file.txt

    cut -b colnum file: 指定欲显示的文件内容范围,并将它们输出到标准输出设备

      比如:输出每行第5个到第9个字符cut -b5-9 file.txt千万不要和cat命令混淆, 这是两个完全不同的命令

    cat file.txt: 输出文件内容到标准输出设备(屏幕)上

    file somefile: 得到文件类型

     read var: 提示用户输入,并将输入赋值给变量

     sort file.txt: 对file.txt文件中的行进行排序

    uniq: 删除文本文件中出现的行列比如: sort file.txt | uniq

    expr: 进行数学运算Example: add 2 and 3expr 2 “+” 3

    find: 搜索文件比如:根据文件名搜索find . -name filename -print

    tee: 将数据输出到标准输出设备(屏幕) 和文件比如:somecommand | tee outfile

    basename file: 返回不包含路径的文件名比如: basename /bin/tux将返回 tux

    dirname file: 返回文件所在路径比如:dirname /bin/tux将返回 /bin

    head file: 打印文本文件开头几行

    tail file : 打印文本文件末尾几行

    sed: Sed是一个基本的查找替换程序。可以从标准输入(比如命令管道)读入文本,并将结果输出到标准输出(屏幕)。该命令采用正则表达式(见参考)进行搜索。不要和shell中的通配符相混淆。比如:将linuxfocus替换为 LinuxFocus :cat text.file | sed ’s/linuxfocus/LinuxFocus/’ >newtext.fileawk: awk 用来从文本文件中提取字段。缺省地,字段分割符是空格,可以使用-F指定其他分割符。

    catfile.txt | awk -F, ‘{print $1 “,” $3}’这里我们使用,作为字段分割符,同时打印第一个和第三个字段。

    如果该文件内容如下: Adam Bor, 34, IndiaKerryMiller, 22, USA命令输出结果为:Adam Bor, IndiaKerry Miller, USA

  2) 概念:

  管道, 重定向和 backtick

  这些不是系统命令,但是他们真的很重要。

  管道 ( | ) 将一个命令的输出作为另外一个命令的输入。

  grep “hello” file.txt | wc -l

  在file.txt中搜索包含有”hello”的行并计算其行数。在这里grep命令的输出作为wc命令的输入。当然您可以使用多个命令。

  重定向:将命令的结果输出到文件,而不是标准输出(屏幕)。

  > 写入文件并覆盖旧文件

  >> 加到文件的尾部,保留旧文件内容。

  反短斜线

  使用反短斜线可以将一个命令的输出作为另外一个命令的一个命令行参数。

  命令:

  find . -mtime -1 -type f -print

  用来查找过去24小时(-mtime –2则表示过去48小时)内修改过的文件。

  如果您想将所有查找到的文件打一个包,则可以使用以下linux 脚本:

  #!/bin/sh

  # The ticks are backticks (`) not normal quotes (‘):

  tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f -print`

  3) 流程控制

  1.if

  “if” 表达式 如果条件为真则执行then后面的部分:

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

  大多数情况下,可以使用测试命令来对条件进行测试。比如可以比较字符串、判断文件是否存在及是否可读等等…

  通常用” [ ] “来表示条件测试。注意这里的空格很重要。要确保方括号的空格。

  [ -f "somefile" ] :判断是否是一个文件

  [ -x "/bin/ls" ] :判断/bin/ls是否存在并有可执行权限

  [ -n "$var" ] :判断$var变量是否有值  

  [ "$a" = "$b" ] :判断$a和$b是否相等

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

  直接执行以下脚本:

  #!/bin/sh

  if [ "$SHELL" = "/bin/bash" ]; then

  echo “your login shell is the bash (bourne again shell)”

  else

  echo “your login shell is not bash but $SHELL”

  fi

  变量$SHELL包含了登录shell的名称,我们和/bin/bash进行了比较。

  快捷操作符

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

  [ -f "/etc/shadow" ] && echo “This computer uses shadow passwors”

  这里 && 就是一个快捷操作符,如果左边的表达式为真则执行右边的语句。

  您也可以认为是逻辑运算中的与操作。上例中表示如果/etc/shadow文件存在则打印” This computer uses shadow passwors”。同样或操作(||)在shell编程中也是可用的。这里有个例子:

  #!/bin/sh

  mailfolder=/var/spool/mail/james

  [ -r "$mailfolder" ]‘ ‘{ echo “Can not read $mailfolder” ; exit 1; }

  echo “$mailfolder has mail from:”

  grep “^From ” $mailfolder

  该脚本首先判断mailfolder是否可读。如果可读则打印该文件中的”From” 一行。如果不可读则或操作生效,打印错误信息后脚本退出。这里有个问题,那就是我们必须有两个命令:

  ◆打印错误信息

  ◆退出程序

  我们使用花括号以匿名函数的形式将两个命令放到一起作为一个命令使用。一般函数将在下文提及。

  不用与和或操作符,我们也可以用if表达式作任何事情,但是使用与或操作符会更便利很多。

循环语句:

     #!/bin/bash 
  for i in $( seq 1 100 )
  do echo $i
  done

linux下sh语法(转载)的更多相关文章

  1. 在linux下sh批处理文件调用java的方法

    解密 java -classpath collection-impl-0.0.1.jar com.ai.toptea.collection.message.DESEncrypt 1EFE4663895 ...

  2. [C/C++]linux下c-c++语法知识点归纳和总结

    1.c/c++申请动态内存 在c++中,申请动态内存是使用new和delete,这两个关键字实际上是运算符,并不是函数. 而在c中,申请动态内存则是使用malloc和free,这两个函数是c的标准库函 ...

  3. Linux下安装PostgreSQL 转载linux社区

    Linux下安装PostgreSQL [日期:2016-12-25] 来源:Linux社区  作者:xiaojian [字体:大 中 小]   在Linux下安装PostgreSQL有二进制格式安装和 ...

  4. linux下sh脚本/bin/bash^M问题解决

    如果是在windows下编辑的脚本,到了linux下运行时会报出这样的错误/bin/bash^M:bad interpreter: No such file or directory这时因为编码的问题 ...

  5. linux 下 .sh 文件语法

    转自:http://blog.sina.com.cn/s/blog_54f82cc201010hfz.html 介绍: 1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh ...

  6. Linux下sh/bash/source/.命令的区别(转)

    一..sh文件介绍 .sh为Linux的脚本文件,我们可以通过.sh执行一些命令,可以理解为windows的.bat批处理文件. 二.点命令(.) .命令和source是同一个命令,可以理解为sour ...

  7. Linux下sh文件运行及桌面环境双击运行sh文件

    sh文件运行: 1.修改为可执行权限: chmod u+x hello.sh 2.运行 ./hello.sh 3.不使用可执行权限修改,用sh直接运行 sh ./hello.sh 桌面环境双击运行sh ...

  8. linux下执行.sh文件的方法和语法

    linux下执行.sh文件的方法    .sh文件就是文本文件,如果要执行,需要使用chmod a+x xxx.sh来给可执行权限.       是bash脚本么   可以用touch test.sh ...

  9. linux下后台启动springboot项目(转载)

    我们知道启动springboot的项目有三种方式: 运行主方法启动 使用命令 mvn spring-boot:run”在命令行启动该应用 运行“mvn package”进行打包时,会打包成一个可以直接 ...

随机推荐

  1. 用nginx实现分布式限流

    1.前言 一般对外暴露的系统,在促销或者黑客攻击时会涌来大量的请求,为了保护系统不被瞬间到来的高并发流量给打垮, 就需要限流 . 本文主要阐述如何用nginx 来实现限流. 听说 Hystrix 也可 ...

  2. 从ABC到流利口语-unit01

    Unit 1 Introduction1 Good evening,everyone.It's a pleasure to you all. My name is Wang Dong.I'M from ...

  3. Centos6.4 安装bind dns 服务器

    一.介绍 1)Centos6.4 64bit minimal 2) bind-9.8.2-0.30.rc1.el6_6.3.x86_64 二.安装 $ yum install -y bind bind ...

  4. PHP 之二位数组根据某个字段排序封装

    /** * @param $array * @param $keys * @param string $sort * @return array */ function arraySort($arra ...

  5. CF176E Archaeology(set用法提示)

    题目大意: 给一棵树,每次激活或熄灭一个点,每次问这些点都联通起来所需的最小总边权 分析: 若根据dfs序给所有点排序,为$v1,v2,v3....vk$,那么答案就是$(dis(v1,v2)+dis ...

  6. 【上海站】EOLINKER 用户培训之旅,等你来共建API新连接

    从今年3月4日起,EOLINKER AMS 团队将再次开启全国用户培训之旅.本次全国培训之旅依旧将覆盖北上广深等国内主要城市,重点提供两种服务内容,一是 对 EOLINKER 产品的交流,包括 API ...

  7. 所有对象的父类(java.lang.Object)

    一.介绍 Object类是类层次结构的根源,每一个类都存在一个父类为Object类.所有的对象,包括数组,都实现了 Object 类的方法. 二.对象初始化 这里使用了静态代码块进行Object类的初 ...

  8. Oracle中的rownum 和rowid的用法和区别

    Oracle中的rownum 和rowid的用法和区别   1.rownum是伪列,是在获取查询结果集后再加上去的 (获取一条记录加一个rownum).对符合条件的结果添加一个从1开始的序列号. eg ...

  9. perf-perf stat用户层代码分析

    perf_event 源码分析 前言 简单来说,perf是一种性能监测工具,它首先对通用处理器提供的performance counter进行编程,设定计数器阈值和事件,然后性能计数器就会在设定事件发 ...

  10. Nginx配置文件的高亮显示设置

    linux系统下vim或者vi编辑器默认是没有对nginx的语法高亮设置. 1.下载vi语法高亮配置到 ~/.vim/syntax,如果不存在则创建该目录,cd ~/.vim/syntax wget ...