zoukankan      html  css  js  c++  java
  • linux shell 入门

    本文是本人学习linux shell入门收集整理,不完全原创。

    参考博文:

    http://www.cnblogs.com/suyang/archive/2008/05/18/1201990.html

    本人学习环境Ubuntu12.04 server虚拟机。

    shell种类

    目前流行的Shell有ash, bash, ksh, csh, zsh等,你可以用下面的命令来查看你自己的Shell类型:

      # echo $SHELL

      $SHELL是一个环境变量,它记录用户所使用的Shell类型。你可以用命令:

      # Shell-name

      来转换到别的Shell,这里Shell-name是你想要尝试使用的Shell的名称,如ash等。这个命令为用户又启动了一个Shell,这个Shell在最初登录的那个Shell之后,称为下级的Shell或子Shell。

      使用命令:

      # exit

      可以退出这个子Shell。

     

      使用不同的Shell的原因在于它们各自都有自己的特点,下面做一个简单的介绍:

      1.ash

      ash Shell是由Kenneth Almquist编写的,是Linux中占用系统资源最少的一个小Shell,它只包含24个内部命令,因而使用起来很不方便。

      2.bash

      bash是Linux系统默认使用的Shell,它由Brian Fox和Chet Ramey共同完成,是Bourne Again Shell的缩写,内部命令一共有40个。Linux使用它作为默认的Shell是因为它有以下的特色:

      (1)可以使用类似DOS下面的doskey的功能,用上下方向键查阅和快速输入并修改命令。

      (2)自动通过查找匹配的方式,给出以某字串开头的命令。

      (3)包含了自身的帮助功能,你只要在提示符下面键入help就可以得到相关的帮助。

      3.ksh

      ksh是Korn Shell的缩写,由Eric Gisin编写,共有42条内部命令。该Shell最大的优点是几乎和商业发行版的ksh完全相容,这样就可以在不用花钱购买商业版本的情况下尝试商业版本的性能了。

      4.csh

      csh是Linux比较大的内核,它由以William Joy为代表的共计47位作者编成,共有52个内部命令。该Shell其实是指向/bin/tcsh这样的一个Shell,也就是说,csh其实就是tcsh。

      5.zch

      zch是Linux最大的Shell之一,由Paul Falstad完成,共有84个内部命令。如果只是一般的用途,是没有必要安装这样的Shell的。

     

    Ubuntu 默认为bash。

     

     Hello world

     

    1、新建文件

      vi helloworld.sh

    1 #!/bin/bash  //开头必备
    2 
    3 #print hello world in the console window
    4 
    5 a="hello world" //=号两边不能有空格
    6 
    7 echo $a

    2、赋予权限

      chmod +x filename.sh

    3、执行

      ./helloworld.sh

     

    详细学习

     

    这部分,我参考的博文就很好,这里引用过来,方便查看。

    下面我们来看一个更复杂的例子,结合这个例子,我们来讲述Shell Script的语法。 
    
     1 #!/bin/bash
     2 # we have less than 3 arguments. Print the help text:
     3 if [ $# -lt 3 ]; then
     4 cat<<HELP
     5      ren -- renames a number of files using sed regular expressions
     6 
     7      USAGE: ren 'regexp' 'replacement' files
     8      EXAMPLE: rename all *.HTM files in *.html:
     9      ren 'HTM$' 'html' *.HTM
    10 
    11 HELP
    12      exit 0
    13 fi
    14 OLD="$1"
    15 NEW="$2"
    16 # The shift command removes one argument from the list of
    17 # command line arguments.
    18 shift
    19 shift
    20 # $* contains now all the files:
    21 for file in $*; do
    22 if [ -f "$file" ]; then
    23     newfile=`echo "$file" | sed  "s/${OLD}/${NEW}/g"`
    24         if [ -f "$newfile" ]; then
    25             echo "ERROR: $newfile exists already"
    26         else
    27             echo "renaming $file to $newfile "
    28             mv "$file" "$newfile"
    29         fi
    30 fi
    31 done
    我们从头来看,前面两行上一个例子中已经解释过了,从第三行开始,有新的内容。if语句和其他编程语言相似,都是流程控制语句。它的语法是:
    if …; then … elif …; then … else … fi 与其他语言不同,Shell Script中if语句的条件部分要以分号来分隔。第三行中的[]表示条件测试,常用的条件测试有下面几种: [ -f "$file" ] 判断$file是否是一个文件 [ $a -lt 3 ] 判断$a的值是否小于3,同样-gt和-le分别表示大于或小于等于 [ -x "$file" ] 判断$file是否存在且有可执行权限,同样-r测试文件可读性 [ -n "$a" ] 判断变量$a是否有值,测试空串用-z [ "$a" = "$b" ] 判断$a和$b的取值是否相等 [ cond1 -a cond2 ] 判断cond1和cond2是否同时成立,-o表示cond1和cond2有一成立 要注意条件测试部分中的空格。在方括号的两侧都有空格,在-f、-lt、=等符号两侧同样也有空格。如果没有这些空格,Shell解释脚本的时候就会出错。 $#表示包括$0在内的命令行参数的个数。在Shell中,脚本名称本身是$0,剩下的依次是$0、$1、$2…、${10}、${11},等等。$*表示整个参数列表,不包括$0,也就是说不包括文件名的参数列表。 现在我们明白第三行的含义是如果脚本文件的参数少于三个,则执行if和fi语句之间 的内容。然后,从第四行到第十一行之间的内容在Shell Script编程中被称为Here文档,Here文档用于将多行文本传递给某一命令。Here文档的格式是以<<开始,后跟一个字符串,在 Here文档结束的时候,这个字符串同样也要出现,表示文档结束。在本例中,Here文档被输出给cat命令,也即将文档内容打印在屏幕上,起到显示帮助 信息的作用。 第十二行的exit是Linux的命令,表示退出当前进程。在Shell脚本中可以使用所有的Linux命令,利用上面的cat和exit,从一方面来说,熟练使用Linux命令也可以大大减少Shell脚本的长度。 十四、十五两句是赋值语句,分别将第一和第二参数赋值给变量OLD和NEW。紧接下来的两句是注释,注释下面的两条shift的作用是将参数列表中的第一个和第二个参数删除,后面的参数依次变为新的第一和第二参数,注意参数列表原本也不包括$0。 然后,自二十一行到三十一行是一个循环语句。Shell Script中的循环有下面几种格式: while [ cond1 ] && { || } [ cond2 ] …; do … done for var in …; do … done for (( cond1; cond2; cond3 )) do … done until [ cond1 ] && { || } [ cond2 ] …; do … done 在上面这些循环中,也可以使用类似C语言中的break和continue语句中断 当前的循环操作。第二十一行的循环是将参数列表中的参数一个一个地放入变量file中。然后进入循环,判断file是否为一个文件,如果是文件的话,则用 sed命令搜索和生成新的文件名。sed基本上可以看成一个查找替换程序,从标准输入,例如管道读入文本,并将结果输出到标准输出,sed使用正则表达式 进行搜索。在第二十三行中,backtick(`)的作用是取出两个backtick之间的命令输出结果,在这里,也就是将结果取出赋给变量 newfile。此后,判断newfile是否已经存在,否则就把file改成newfile。这样我们就明白这个脚本的作用了,Shell Script编写的其他脚本与此相似,只不过是语法和用法稍有不同而已。

     

  • 相关阅读:
    python 引用和对象理解
    ABP .Net Core 部署到IIS 问题汇总
    Ionic2 cordova angular2 打包到Android apk环境搭建
    学习ABP ASP.NET Core with Angular 环境问题
    [AngularJS 2 实践 一]My First Angular App
    即时通信系统Openfire分析之一:Openfire与XMPP协议
    S3C6410启动过程分析
    使用Word发表博客园博文
    github学习笔记
    Mac环境下 配置Python数据分析环境
  • 原文地址:https://www.cnblogs.com/FlyFive/p/3637611.html
Copyright © 2011-2022 走看看