zoukankan      html  css  js  c++  java
  • Linux Shell编程

    在linux系统中,我们一般都是用C语言写服务端程序,但是一般我们不直接启动这个程序,而是通过一个shell脚本启动和关闭(需要设置一些环境变量和防止打开多个改程序,打开多个后需要找到pid才能关闭)

    那么shell是什么呢?

    说白了shell是操作系统提供给我们的一种语言,用来将用户的命令输送到内核中执行

    shell编程

    1首先我新建一个test2.sh,存放下面的一段shell代码

    2保存后,修改这个shell为可执行文件 chmod +x test2.sh

    #! /bin/sh
    #定义变量
    name=张三
    echo $name
    echo "参数:$*"
    echo "参数个数$#"

    输出结果:

    下面分别介绍字段的含义

    第一行一般默认第一行都是上面这段#! /bin/sh,通知系统用/bin/sh来执行下面的程序。

    以“#”开头的行代表注释

    echo代表输出后面一段话的到用户界面

    $name代表使用了name这个变量(定义shell变量在下面介绍)

    $* 代表所有的参数(我们在shell命令后面加了hello 和world两个参数)

    $#代表参数的个数

    有了初步的认识,我们就开始踏入shell编程吧!

    1shell变量

    定义shell变量:(注意等号左边右边不可以有空格)

    shellname=value

    使用shell变量

    $shellname


    2$数字

    代表第几个参数

    例如$1代表第一个参数,按照上面的代码就是hello

    还有下面的一些$符号的使用。

    可能会对$?有一点费解,例如我们在shell中调用了一个C语言程序mydemo,其中mydemo这个主函数会返回100(这里不写c代码了)

    #! /bin/sh
    ./mydemo
    echo $?

    shell输出值:100

    也可以是执行一段shell函数,获取该函数的返回值(最后讲函数说到)


    3shell中执行命令

    如果我们想在shell中执行一段命令,并将该命令的值存放到一个变量中,就要用到` `符号(在1数字旁边)

    #! /bin/sh
    result=`ls`
    echo result=$result

    ls命令显示当前文件夹下有哪些文件

    输出结果:result=test.sh ...


    4读取键盘

    我们在运行shell的时候,可能需要我们输入一些数据,除了带参数的方式我们还可以使用read进行读

    #! /bin/sh
    echo "please enter a"
    read a
    echo "please enter b"
    read b
    echo "a=$a,b=$b"

    输出结果:

    read命令读取一个输入行,直至遇到换行符。

    行尾的换行符在读入时将被转换成一个空字符

    如果read命令后有变量名,输入内容赋给该变量。

    如果read命令后未跟变量名,读入的行将被赋值给内置变量REPLY。


     shell也会像高级语言支持if,while等计算

    if语句(两种)

    (一)第一种if(用来判断条件是否正确)

    格式:(fi代表这个if结束)

    if (test condition) then
      commands
    else
      commands
    fi
    test是一个固定关键字,用来判断condition的描述是否正确
    #! /bin/sh
    if (test "start" =  "${1}" ) then
            echo "start"
    else
            echo "end"
    fi
    执行结果:

    (二)第二种if(用来判断文件或者文件夹是否存在)

    格式:

    if [ -option file]; then
      commands
    else
      commands
    fi

    代码:

    #! /bin/sh
    if [ -d "${1}" ]; then
            echo exist
    else
            echo notexist
    fi

    运行

    查看dir1文件夹是否存在,因为我创建了一个,所以是存在的。

    其中还有一些其他选项


    while循环

    代码格式:([右边和]左边都要有一个空格哦,done代表循环结束,当条件不成立时候循环结束)

    while [ expr ];
    do
      commands
    done

    代码demo(大家可以自己验证哈)

    #! /bin/sh
    tmp=0
    while [ "$tmp" != "5" ];
    do
            echo "curtmp=$tmp"
            tmp=$[ $tmp + 1 ]
    
    done

    case分支语句

    同样也支持像switch那样的分支选择语句的

    代码格式:(如果有一个pattern匹配到跟string内容一样,执行这里面的内容,否则执行最下面的*分支,;;两个分号代表退出case循环,跟C语言的break)

    case "string" in
    pattern_1)
      commands
    ;;
    pattern_2)
      commands
    ;;
    *)
      commands
    ;;
    esac

    for循环

    代码格式:(会遍历这个list数组,将当前值存放到varname变量中,后面的分号也是必不可少的哦

    for varname in list ;
    do
      commands
    done
    代码demo
    #! /bin/sh
    for name in $*;
    do
            echo "$name"
    done
    上面的代码会输出所有的参数。

    exit语句

    跟C语言的exit很类似,代表退出当前shell
    代码格式:(code代表退出码)
    exit code
    可以在一个Ashell中调用另一个Bshell,可以在Ashell通过$?得到Bshellexit退出吗

    函数

    shell同样也是支持函数的哈
    代码格式:(使用前必须先定义函数)
    function funcname
    {
      commands
    }
    代码demo:
    #! /bin/sh
    function fun1
    {
            echo "第一个参数:$1"
            echo "第二个参数: $2"
            return 100
    }
    fun1 3 4
    echo "函数返回值:$?"
    上面代码输出什么大家应该知道了。可以再验证一下

    总结demo

     最后写一个demo,代表打开某个进程(如果已经打开就不再重复打开)
     #! /bin/sh
    me=`whoami`
    PID=`ps -u $me |grep mydemo|awk {'print $1'}`
    if( test "$PID" = "" ) then
            `mydemo`
    fi
    PID的变量用来获取mydemo的pid值
    grep代表搜索mydemo这个进程
    awd标识输出这一行的第一列,也就是pid的值
    大家可以了解一下ps,grep,awk命令哈
  • 相关阅读:
    我的知识库(4) java获取页面编码(Z)
    知识库(3)JAVA 正则表达式 (超详细)
    The Struts dispatcher cannot be found. This is usually caused by using Struts tags without the associated filter. Struts
    某人总结的《英语听力的技巧 》,挺搞的
    我的知识库(5)java单例模式详解
    构建可扩展程序
    SerialPort (RS232 Serial COM Port) in C# .NET
    Python学习笔记——String、Sequences
    UI题目我的答案
    jQuery学习系列学会操纵Form表单元素(1)
  • 原文地址:https://www.cnblogs.com/nfcm/p/7743418.html
Copyright © 2011-2022 走看看