zoukankan      html  css  js  c++  java
  • Linux编写Shell脚本入门

    一、 一般编写shell需要分3个步骤

    1. 新建一个脚本文件,并编写程序

    vi hello.sh

    #!/bin/bash
    
    #注释
    
    #输出
    printf '%s\n' "Hello World!"
    echo "Hello World!"

    2. 给该文件添加执行权限
    chmod +x hello.sh

    如果权限不够,可以用管理员权限

    sudo chmod +x hello.sh

    3. 执行脚本

    相对路径,在这个脚本所在的文件下,

    ./hello.sh

    绝对路径,假设我的文件在/home/user/hello.sh

    ./home/user/hello.sh

    可以不给文件加权限(即不要第2步)直接执行,如下命令:

    bash hello.sh

    sh hello.sh

    4. 输出结果如下

    Hello World!

    Hello World!

    二、 计算程序运行时间

    1. 首先获取时间

    #!/bin/bash
    #获取当前时间 yyyy-MM-dd HH:mm:ss 格式
    nowtime=`date --date='0 days ago' "+%Y-%m-%d %H:%M:%S"`
    #获取当前日间 HH:mm:ss 格式
    nowtime2=`date --date='0 days ago' +%H:%M:%S`
    printf '%s\n' "A is: $nowtime"
    printf '%s\n' "A is: $nowtime2"
    View Code

    可以参考www.2cto.com/os/201512/455379.html

    2. 执行程序

    其中sum是我写的c语言程序编译后的文件

    #!/bin/bash
    #绝对路径
    /home/hadoop/zc/c/sum 
    #相对路径
    #./sum

    3. 程序运行时间(延时)

    Linux shell脚本中的延时

    可以使用sleep或usleep函数:

    i: sleep:默认为秒

    sleep 1s 表示延时1秒

    sleep 1m 表示延时1分钟

    sleep 1h 表示延时1小时

    sleep 1d 表示延时1天

    ii: usleep:默认为微秒

    1s = 1000ms = 1000000us

    #!/bin/bash
    #s为单位
    #date中有很多控制格式的,其中%s是获取当前时间距离1970-01-01 00:00:00 UTC的时间差。
    #记录开始时间
    start=$(date +%s)
    #程序
    sleep 5s
    #记录结束时间
    end=$(date +%s)
    #计算时差
    time=$(( $end - $start )) 
    #输出 
    #echo $time
    printf '%s\n' "sleep $time seconds"

    4. 程序执行时间(以sum为例)

    #!/bin/bash
    #s为单位
    #date中有很多控制格式的,其中%s是获取当前时间距离1970-01-01 00:00:00 UTC的时间差。
    #记录开始时间
    start=$(date +%s)
    #程序
    /home/hadoop/zc/c/sum
    #记录结束时间
    end=$(date +%s)
    #计算时差
    time=$(( $end - $start )) 
    #输出 
    #echo $time
    printf '%s\n' "Program Finished in $time seconds"

    三、 先后提交两个程序

    如果两个程序在一个终端提交,则运行会出现问题。所以两个程序要在多个终端上运行。

    linux Shell新建终端,可以参考Ubuntu下自动打开多终端的多个标签并执行不同脚本的方法

    #!/bin/bash
    #新建终端
    gnome-terminal
    #新建标签页
    #gnome-terminal --tab

    但是,新建终端后,两个程序还是在同一个终端上运行,还会出问题。

    i: 一个脚本的实现,运行两个程序。(以sum为例,假设sum在/home/user下面)

    #!/bin/bash
    
    printf '%s\n' "Hello test!"
    
    gnome-terminal -x bash -c "/home/user/sum;exec bash"

    ii: 我用两个脚本做的,第一个脚本是wc.sh,第二个脚本是pi.sh,我们执行第一个脚本,第一个脚本延迟5s后自动调用第二个脚本如下:

    #!/bin/bash
    printf '%s\n' "Hello WC!"
    #休眠5s
    sleep 5s
    #
    #./pi.sh
    gnome-terminal -x bash -c "bash ./pi.sh;exec bash"
    #或者
    #gnome-terminal -x bash -c "./pi.sh;exec bash"
    #!/bin/bash
    #新建终端
    #gnome-terminal -x bash -c "ls; exec bash"
    
    printf '%s\n' "Hello Pi!"

    最后效果是先打印出Hello WC! ,然后等5秒,创建一个新终端,并调用pi.sh ,这时开始执行pi.sh,结果是打印Hello Pi!

    关于怎样在新的终端调用程序,可以参考gnome-terminal技巧

    四、 linux 下如何通过ssh到其他机器然后执行命令

    这里ssh免密钥连接就不讲了。

    如果我连到另一台机器上只是执行一个命令可以这样写:

    ssh hostname@IP  cd /opt/    #其中 hostname是你要连接机器的用户名,IP是其对应的IP地址

    如果我连到另一台机器上执行多于一个命令可以这样写:

    ssh hostname@IP "cd /opt/;pwd"    #注意:当多于两个命令时,一定要把所有命令以分号的方式写在双引号里面。
  • 相关阅读:
    WPF获取程序版本号(Version)的方法
    WPF中Popup等弹窗的位置不对(偏左或者偏右)
    WPF中Expander与ListBox(ItemsControl)嵌套中的问题
    WPF自定义Button样式(按钮长度随Content长度自适应)
    WPF解决当ScrollViewer中嵌套ItemsControl时,不能使用鼠标来滚动翻页
    WPF中Window的ShowInTaskbar、Owner和Topmost属性
    WPF通过<x:Array>直接为ListBox的ItemsSource赋值
    常用的谓词和逻辑运算符
    利用OVER开窗函数分页
    一个单表查询的示例
  • 原文地址:https://www.cnblogs.com/zhangchao0515/p/6305886.html
Copyright © 2011-2022 走看看