zoukankan      html  css  js  c++  java
  • shell 使用

    1、shell 将一串命令的结果 赋值给一变量

    a=$(command) 

    2、查看一个文件多少行

    shell取得文件行数
    2007-01-31 13:16

    总结了一下有五种方法:
    现在有一个a文件,共有55行

    第一种:
    # awk '{print NR}' a|tail -n1

    55

    第二种:

    begincwcw兄的这个:

    # awk 'END{print NR}' a

    55

    第三种:

    # grep -n "" a|awk -F: '{print '}|tail -n1
    55

    第四种:
    honbj兄的也不错:

    # sed -n '$=' a
    55

    第五种

    # wc -l a|awk '{print }'
    55


    第六种

    #cat a |wc -l

    3、字符串比较

    比较两个字符串是否相等的办法是:
    if [ "$test"x = "test"x ]; then

    这里的关键有几点:
    1 使用单个等号
    2 注意到等号两边各有一个空格:这是unix shell的要求
    3 注意到"$test"x最后的x,这是特意安排的,因为当$test为空的时候,上面的表达式就变成了x = testx,显然是不相等的。而如果没有这个x,表达式就会报错:[: =: unary operator expected

    二元比较操作符,比较变量或者比较数字.注意数字与字符串的区别.
    整数比较
    -eq 等于,如:if [ "$a" -eq "$b" ]
    -ne 不等于,如:if [ "$a" -ne "$b" ]
    -gt 大于,如:if [ "$a" -gt "$b" ]
    -ge 大于等于,如:if [ "$a" -ge "$b" ]
    -lt 小于,如:if [ "$a" -lt "$b" ]
    -le 小于等于,如:if [ "$a" -le "$b" ]
    大于(需要双括号),如:(("$a" > "$b"))
    >= 大于等于(需要双括号),如:(("$a" >= "$b"))
    小数据比较可使用AWK
    字符串比较
    = 等于,如:if [ "$a" = "$b" ]
    == 等于,如:if [ "$a" == "$b" ],与=等价
    注意:==的功能在[[]]和[]中的行为是不同的,如下:
    1 [[ $a == z* ]] # 如果$a以"z"开头(模式匹配)那么将为true
    2 [[ $a == "z*" ]] # 如果$a等于z*(字符匹配),那么结果为true
    3
    4 [ $a == z* ] # File globbing 和word splitting将会发生
    5 [ "$a" == "z*" ] # 如果$a等于z*(字符匹配),那么结果为true
    一点解释,关于File globbing是一种关于文件的速记法,比如"*.c"就是,再如~也是.
    但是file globbing并不是严格的正则表达式,虽然绝大多数情况下结构比较像.
    != 不等于,如:if [ "$a" != "$b" ]
    这个操作符将在[[]]结构中使用模式匹配.
    大于,在ASCII字母顺序下.如:
    if [[ "$a" > "$b" ]]
    if [ "$a" > "$b" ]
    注意:在[]结构中">"需要被转义.
    具体参考Example 26-11来查看这个操作符应用的例子.
    -z 字符串为"null".就是长度为0.
    -n 字符串不为"null"

    4、ssh远程执行命令

    前提条件:

      配置ssh免密码登陆

    对于简单的命令:

      如果是简单执行几个命令,则:

    ssh user@remoteNode "cd /home ; ls"
    

      基本能完成常用的对于远程节点的管理了,几个注意的点:

    1. 双引号,必须有。如果不加双引号,第二个ls命令在本地执行
    2. 分号,两个命令之间用分号隔开

    对于脚本的方式:

      有些远程执行的命令内容较多,单一命令无法完成,考虑脚本方式实现:

    复制代码
    #!/bin/bash
    ssh user@remoteNode > /dev/null 2>&1 << eeooff
    cd /home
    touch abcdefg.txt
    exit
    eeooff
    echo done!
    
    复制代码

      远程执行的内容在“<< eeooff ” 至“ eeooff ”之间,在远程机器上的操作就位于其中,注意的点:

    1. << eeooff,ssh后直到遇到eeooff这样的内容结束,eeooff可以随便修改成其他形式。
    2. 重定向目的在于不显示远程的输出了
    3. 在结束前,加exit退出远程节点
     
    由于集群节点较多,想把执行内容较多的写法写进until循环内,如下,总是报 unexpected end of file!不知道为何??
    i=2 
    until
    test $i -gt 33 
    do
      ssh user@remoteNode > /dev/null 2>&1 << eeooff
      cd /home
      touch abcdefg.txt
      exit
      eeooff
    
      i=$(($i+1))
    done
    
    另外,在shell中使用date来获取当前日期和时间的时候,可以选择格式
    send=`date '+%Y-%m-%d %H:%M:%S'`
    send=`date -d 'next-year' "+%Y-%m-%d"`
  • 相关阅读:
    CSS技巧(二):CSS hack
    CSS技巧(一):清除浮动总洁
    js中apply方法的使用
    call 方法
    正则表达式
    【js事件详解】js事件封装函数,js跨浏览器事件处理机制
    [BZOJ 4300] 绝世好题
    [SPOJ1557] Can you answer these queries II
    [Codeforces 877E] Danil and a Part-time Job
    [Codeforces 914D] Bash and a Tough Math Puzzle
  • 原文地址:https://www.cnblogs.com/playboysnow/p/4972063.html
Copyright © 2011-2022 走看看