Unix/Linux shell入门

作者: 半身猿 | 来源:发表于2018-12-09 22:46 被阅读2次
    一. 介绍

    shell脚本,顾名思义就是跟执行shell命令、shell交互的脚本。由于历史原因,shell语法比较怪异。

    二. 基本语法
    1. hello world

    创建文件hello_world.sh

    #!/bin/sh
    # This is a comment!
    echo Hello World    # This is a comment, too!
    

    修改增加执行权限

    $ chmod a+rx hello_world.sh
    

    然后即可执行

    $ ./hello_world.sh
    

    可以看到打印输出了Hello World,同在Terminal中直接执行echo Hello World的结果一样。

    2. 变量

    shell中的变量可以直接使用,像一些脚本一样(如js,python),而不用先定义(如C,Java)。调用时在变量名前加$符号即可。
    var.sh

    #!/bin/sh
    MY_MESSAGE="Hello World"
    echo $MY_MESSAGE
    

    可以使用read方法从与Terminal交互读取。
    var2.sh

    #!/bin/sh
    echo What is your name?
    read MY_NAME
    echo "Hello $MY_NAME - hope you're well."
    

    注意$MY_NAME前后是有空格的,若无空格则要用{}将变量名括起来。
    var3.sh

    #!/bin/sh
    echo What is your name?
    read MY_NAME
    echo "Hello ${MY_NAME}-hope you're well."
    

    对于一些特殊的字符如 " $ ` \ 需要在前面加\进行转义处理。

    echo "Hello \"World\""
    
    3. 作用域
    a.

    在Terminal中使用export导出变量

    $ export MY_VAR="hello"
    

    再执行shell脚本,则可以在脚本中访问到

    echo "myvar is : $MY_VAR"
    
    b.

    反过来,若要在Terminal中访问到shell脚本中的变量,则应该以source的方式执行脚本。
    myvar.sh

    MYVAR = "hello"
    
    $ source myvar.sh
    echo $MYVAR
    
    c.

    而在shell脚本内部,所有变量都是全局的,这一点跟高级语言不同。

    4. 循环
    a. for
    #!/bin/sh
    for i in 1 2 3 4 5
    do
      echo "Looping ... number $i"
    done
    
    b. while
    #!/bin/sh
    INPUT_STRING=hello
    while [ "$INPUT_STRING" != "bye" ]
    do
      echo "Please type something in (bye to quit)"
      read INPUT_STRING
      echo "You typed: $INPUT_STRING"
    done
    
    5. 条件
    a. if
    if  [ something ]; then
     echo "Something"
     elif [ something_else ]; then
       echo "Something else"
     else
       echo "None of the above"
    fi
    

    注意[]间要有空格

    b. case
    #!/bin/sh
    
    echo "Please talk to me ..."
    while :
    do
      read INPUT_STRING
      case $INPUT_STRING in
        hello)
            echo "Hello yourself!"
            ;;
        bye)
            echo "See you again!"
            break
            ;;
        *)
            echo "Sorry, I don't understand"
            ;;
      esac
    done
    echo 
    echo "That's all folks!"
    
    6. 方法
    a. 定义和调用

    function.sh

    #!/bin/sh
    # A simple script with a function...
    
    add_a_user()
    {
      USER=$1
      PASSWORD=$2
      shift; shift;
      # Having shifted twice, the rest is now comments ...
      COMMENTS=$@
      echo "Adding user $USER ..."
      echo "Added user $USER ($COMMENTS) with pass $PASSWORD"
    }
    
    ###
    # Main body of script starts here
    # 调用方法
    ###
    echo "Start of script..."
    add_a_user aaa bbb ccc ddd fff eee
    echo "End of script..."
    

    add_a_user()方法定义中,$1 ,$2依次表示传入的第一个和第二个变量,然后执行了两次shift;,则$@表示第三个至最后一个变量。

    b. 返回值
    #!/bin/sh
    
    getvar()
    {
      return "hello"
    }
    
    ## Main script starts here
    
    getvar
    RESULT=$?
    echo $RESULT
    

    应在执行完方法后,立即读取和保存$?,因为执行完下一条命令后,$?的值就会马上变了。

    c.

    注意由于在shell脚本中是没有局部变量的
    fun_test.sh

    #!/bin/sh
    
    myfunc()
    {
      echo "I was called as : $@"
      x=2
    }
    
    ### Main script starts here 
    
    echo "Script was called with $@"
    x=1
    echo "x is $x"
    myfunc 1 2 3
    echo "x is $x"
    
    fun_test.sh a b c
    

    结果是

    Script was called with a b c
    x is 1
    I was called as : 1 2 3
    x is 2
    
    d.

    可以在一个脚本文件中定义方法,然后在另一个脚本文件中以source方式导入该方法。

    参考文章
    https://www.shellscript.sh

    相关文章

      网友评论

        本文标题:Unix/Linux shell入门

        本文链接:https://www.haomeiwen.com/subject/xzlqhqtx.html