• 初学Linux之简单的Shell


    先占坑,回头补充完善哈

    Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的。
    Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。
     
    windows下是否可执行是由扩展名决定的,但在Linux系统,程序是否可执行是由有没有x权限决定的,为了区分不同的文件类型,shell类型文件一般加.sh后缀。

    创建shell文件:vi shell.sh,然后直接编写就好了

    执行shell脚本:1、子程序的话bash shell.sh或sh shell.sh,父程序的话source shell.sh,要求shell文件有r权限,bash和source两种方式区别这里就不展开了;
            2、./shell.sh直接执行,要求shell文件有r+x权限

    Shell有两种执行命令的方式:
    交互式(Interactive):解释执行用户的命令,用户输入一条命令,Shell就解释执行一条。
    批处理(Batch):用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令。

    先写个简单的自动启动tomcat的shell程序(批处理):

     1 #!/bin/bash
     2 # Program:
     3 # This program is used to start tomcat.
     4 # History:
     5 # 2016/09/11 XH First release
     6 pid=`ps -ef|grep tomcat|grep -v grep|awk '{print $2}'`
     7 #变量名=`命令`,变量与等号之间不能有空格
     8 if [ $pid ]
     9 #[]里头必须有空格
    10 then
    11     echo 'Tomcat is already running..'
    12 else
    13 
    14     /usr/local/tomcat7/bin/startup.sh
    15     echo 'Tomcat has just been started..'
    16     tail -f /usr/local/tomcat7/logs/catalina.out
    17     #启动的同时查看日志文件
    18 fi

    考虑到如果这个shell文件名起名叫start_tomcat.sh,因为包括关键字tomcat,在运行时shell进程的pid也会被获取,那应该运行不到else语句,无法顺利启动tomcat,但是测试了下发现虽然报了个错但tomcat还是启动了,于是简单改了下脚本验证运行结果:

     1 #!/bin/bash
     2 pid=`ps -ef|grep tomcat|grep -v grep|awk '{print $2}'`
     3 ps -ef|grep tomcat|grep -v grep|awk '{print $2}'
     4 echo $pid
     5 if [ $pid ]
     6 then
     7         echo 'Tomcat is already running..'
     8 else
     9         echo 'Tomcat has just been started..'
    10 fi

    下面是运行结果:

    root      8305  6086  0 07:17 pts/0    00:00:00 /bin/bash ./start_tomcat.sh
    8305 8306
    ./start_tomcat.sh: line 5: [: 8305: unary operator expected
    Tomcat has just been started..

    可以看到,除了shell进程,后面又多了个pid是8306的进程,不太明白这个进程是干什么用的,但似乎是因此导致的if判断失败而执行else语句
    为了查明报错是因为有$pid有多行值还是因为包含了shell进程,我又用lampp尝试了下(lampp启动状态,但文件名没有lampp,这样$pid会有多行值但不包含shell进程的pid
    ),确实仍旧执行了else语句,但报的错不一样:line 5: [: too many arguments
    虽然还不是太明白原因,但总之这类脚本以后尽量避免命名含grep关键字,免得出现奇怪的问题,如果非要这么命名,就把grep关键字设成程序的绝对路径。

  • 相关阅读:
    cachecloud搭建.md
    Python glob.md
    python textwrap.md
    Python shutil.md
    python openpyxl.md
    os.path.md
    Python datetime.md
    jenkins运行脚本 报错:UnicodeEncodeError: 'gbk' codec can't encode character 'xa9' in position 449: illegal multibyte sequence
    Python如何去实际提高工作的效率?也许这个会有用!
    Jmeter如何测试接口
  • 原文地址:https://www.cnblogs.com/hywht/p/5864349.html
Copyright © 2020-2023  润新知