zoukankan      html  css  js  c++  java
  • [摘录备忘]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
    

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

    赠人玫瑰
    手留余香

    我们曾如此渴望命运的波澜,到最后才发现:人生最曼妙的风景,竟是内心的淡定与从容……我们曾如此期盼外界的认可,到最后才知道:世界是自己的,与他人毫无关系!-杨绛先生

    如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的推荐按钮。
    如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的关注我

  • 相关阅读:
    JavaScript或jQuery模拟点击超链接和按钮
    web开发中目录路径问题的解决
    jQuery操作复选框的简单使用
    php中常用魔术方法的举例
    Code-Validator:验证经度、验证维度
    Code-Validator:验证身份证号
    Code-Validator:验证IPv6地址
    Code-Validator:验证IPv4地址
    Code-Validator:验证网址(可以匹配IPv4地址但没对IPv4地址进行格式验证;IPv6暂时没做匹配)
    Code-Validator:验证电子邮箱
  • 原文地址:https://www.cnblogs.com/haochuang/p/2285932.html
Copyright © 2011-2022 走看看