zoukankan      html  css  js  c++  java
  • linux学习之linux百问2,不断更新

    1、for/do/done 

    Shell脚本的for循环结构和C语言很不一样,它类似于某些编程语言的foreach循环。例如:

    #! /bin/sh
    
    for FRUIT in apple banana pear; do
      echo "I like $FRUIT"
    done

    FRUIT是一个循环变量,第一次循环$FRUIT的取值是apple,第二次取值是banana,第三次取值是pear。再比如,要将当前目录下的chap0chap1chap2等文件名改为chap0~chap1~chap2~等(按惯例,末尾有~字符的文件名表示临时文件),这个命令可以这样写:

    $ for FILENAME in chap?; do mv $FILENAME $FILENAME~; done

    也可以这样写:

    $ for FILENAME in `ls chap?`; do mv $FILENAME $FILENAME~; done

    2、 while/do/done

    while的用法和C语言类似。比如一个验证密码的脚本:

    #! /bin/sh
    
    echo "Enter password:"
    read TRY
    while [ "$TRY" != "secret" ]; do
      echo "Sorry, try again"
      read TRY
    done

    下面的例子通过算术运算控制循环的次数:

    #! /bin/sh
    
    COUNTER=1
    while [ "$COUNTER" -lt 10 ]; do
      echo "Here we go again"
      COUNTER=$(($COUNTER+1))
    done

    Shell还有until循环,类似C语言的do...while循环。本章从略。

    3、 位置参数和特殊变量

    有很多特殊变量是被Shell自动赋值的,我们已经遇到了$?$1,现在总结一下:

    常用的位置参数和特殊变量

    $0 相当于C语言main函数的argv[0]
    $1$2... 这些称为位置参数(Positional Parameter),相当于C语言main函数的argv[1]argv[2]...
    $# 相当于C语言main函数的argc - 1,注意这里的#后面不表示注释
    $@ 表示参数列表"$1" "$2" ...,例如可以用在for循环中的in后面。
    $? 上一条命令的Exit Status
    $$ 当前Shell的进程号

     

    位置参数可以用shift命令左移。比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1$2$3丢弃,$0不移动。不带参数的shift命令相当于shift 1。例如:

    #! /bin/sh
    
    echo "The program $0 is now running"
    echo "The first parameter is $1"
    echo "The second parameter is $2"
    echo "The parameter list is $@"
    shift
    echo "The first parameter is $1"
    echo "The second parameter is $2"
    echo "The parameter list is $@"

    4、函数

    和C语言类似,Shell中也有函数的概念,但是函数定义中没有返回值也没有参数列表。例如:

    #! /bin/sh
    
    foo(){ echo "Function foo is called";}
    echo "-=start=-"
    foo
    echo "-=end=-"

    注意函数体的左花括号{和后面的命令之间必须有空格或换行,如果将最后一条命令和右花括号}写在同一行,命令末尾必须有;号。

    在定义foo()函数时并不执行函数体中的命令,就像定义变量一样,只是给foo这个名字一个定义,到后面调用foo函数的时候(注意Shell中的函数调用不写括号)才执行函数体中的命令。Shell脚本中的函数必须先定义后调用,一般把函数定义都写在脚本的前面,把函数调用和其它命令写在脚本的最后(类似C语言中的main函数,这才是整个脚本实际开始执行命令的地方)。

    Shell函数没有参数列表并不表示不能传参数,事实上,函数就像是迷你脚本,调用函数时可以传任意个参数,在函数内同样是用$0$1$2等变量来提取参数,函数中的位置参数相当于函数的局部变量,改变这些变量并不会影响函数外面的$0$1$2等变量。函数中可以用return命令返回,如果return后面跟一个数字则表示函数的Exit Status。

    下面这个脚本可以一次创建多个目录,各目录名通过命令行参数传入,脚本逐个测试各目录是否存在,如果目录不存在,首先打印信息然后试着创建该目录。

    #! /bin/sh
    
    is_directory()
    {
      DIR_NAME=$1
      if [ ! -d $DIR_NAME ]; then
        return 1
      else
        return 0
      fi
    }
    
    for DIR in "$@"; do
      if is_directory "$DIR"
      then :
      else
        echo "$DIR doesn't exist. Creating it now..."
        mkdir $DIR > /dev/null 2>&1
        if [ $? -ne 0 ]; then
          echo "Cannot create directory $DIR"
          exit 1
        fi
      fi
    done

    注意is_directory()返回0表示真返回1表示假。


  • 相关阅读:
    php 接口类与抽象类的实际作用
    php中的implements 使用详解
    swoole两种运行模式BASE和PROCESS的区别
    Java多线程总结
    Shell WordCount:一行shell命令统计固定格式单词词频
    收藏大数据相关写的比较好的博客
    Hive-SQL查询连续活跃登陆的用户
    Mysql触发器
    Python json字符串和字典相互转换
    MySQL基础之实现累加值
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3078448.html
Copyright © 2011-2022 走看看