zoukankan      html  css  js  c++  java
  • Linux 基础知识(一) shell的&&和|| 简单使用

      shell 在执行某个命令的时候,会返回一个返回值,该返回值保存在 shell 变量 $? 中。当 $? == 0 时,表示执行成功;当 $? == 1 时,表示执行失败。  有时候,下一条命令依赖前一条命令是否执行成功。如:在成功地执行一条命令之后再执行另一条命令,或者在一条命令执行失败后再执行另一条命令等。shell 提供了 && 和 || 来实现命令执行控制的功能,shell 将根据 && 或 || 前面命令的返回值来控制其后面命令的执行。    

    &&(命令执行控制)    

    语法格式如下:        

      command1 && command2 [&& command3 ...]    

    1 命令之间使用 && 连接,实现逻辑与的功能。  

    2 只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令才会被执行。  

    3 只要有一个命令返回假(命令返回值 $? == 1),后面的命令就不会被执行。  

    #demo1

    www@ubuntu4:~/bin/lua$ ls
    lua.sh
    www@ubuntu4:~/bin/lua$ cp ./lua.sh ./lua_cp.sh && rm ./lua.sh && echo "success" 
    success
    www@ubuntu4:~/bin/lua$ ls
    lua_cp.sh

    说明:命令首先从 /home/www/bin/lua/lua.sh 文件复制 到当前目录重命名为lua_cp.sh,执行成功后,使用 rm命令 删除源文件lua.sh;如果删除成功则输出提示信息。

    ||(命令执行控制)

    语法格式如下:
      command1 || command2 [|| command3 ...] 

    1 命令之间使用 || 连接,实现逻辑或的功能。
    2 只有在 || 左边的命令返回假(命令返回值 $? == 1),|| 右边的命令才会被执行。这和 c 语言中的逻辑或语法功能相同,即实现短路逻辑或操作。
    3 只要有一个命令返回真(命令返回值 $? == 0),后面的命令就不会被执行。

    #demo1

    www@ubuntu4:~/bin/lua$ ls
    lua_cp.sh
    www@ubuntu4:~/bin/lua$ rm ./tinywan.sh && echo "success" || echo "fail" 
    rm: cannot remove ‘./tinywan.sh’: No such file or directory
    fail

    说明:目录下不存在文件 tinywan.sh,将输出提示信息“fail”,删除失败

    #demo2

    www@ubuntu4:~/bin/lua$ ls
    lua_cp.sh
    www@ubuntu4:~/bin/lua$ rm ./lua_cp.sh && echo "success" || echo "fail" 
    success
    www@ubuntu4:~/bin/lua$ ls
    www@ubuntu4:~/bin/lua$ 

    说明:目录下存在文件tinywan.sh,将输出提示信息“success”,删除成功

    $0   当前脚本的文件名
    $1 ~ $n?   位置参数,为从1开始的数字,当n超过9后,使用${n},例如${10},$1是第一个参数,$2是第二个参数,${10}是第十个参数
    $#   传入脚本的参数的个数
    $*   所有的位置参数,但视为一个字符串
    $@   所有以空白隔开的位置参数,即代表各位置参数组成的串行(每个都作为独立的字符串,可用  “for 变量 in 串行” 循环输出)。
    $?   当前Shell进程中,上一个命令的返回值,如果上一个命令成功执行则$?的值为0,否则为其他非零值,常用做if语句条件
    $$   当前Shell进程的pid
    $!   后台运行的最后一个进程的pid
    $-   显示Shell使用的当前选项
    $_   之前命令的最后一个参数

    #demo1

    #!/bin/bash
    echo "$# = 传入脚本的参数的个数: $#"
    echo "$0 = 当前脚本的文件名: $0"
    echo "$1 = first : $1"
    echo "$2 = second: $2"
    echo "$@ = 所有以空白隔开的位置参数: $@"
    echo "$* = 所有的位置参数,但视为一个字符串: $*"
    echo "$$ = 当前Shell进程的pid process id: $$"
    echo "$? = 当前Shell进程中,上一个命令的返回值: $?"

    执行结果:

    www@ubuntu4:~/bin$ ./test2.sh var1 var2 var3 var4 var5 var6 
    $# = 传入脚本的参数的个数: 6
    $0 = 当前脚本的文件名: ./test2.sh
    $1 = first : var1
    $2 = second: var2
    $@ = 所有以空白隔开的位置参数: var1 var2 var3 var4 var5 var6
    $* = 所有的位置参数,但视为一个字符串: var1 var2 var3 var4 var5 var6
    $$ = 当前Shell进程的pid process id: 167270
    $? = 当前Shell进程中,上一个命令的返回值: 0

    在 [[ 判断式 ]] 中,如果使用 == 或 != ,且在这两个运算符右方的字符串没有加上单引号或双引号,则 == 和 != 会视为想要对比该字符串所形成的“样式”,如果相等,传回0,如果不符,传回1。

    #!/bin/bash
     
    a="str"
    if [[ $a == ??? ]]; then
        echo "Match"
    fi

    行4,[[ $a == ??? ]] 的意思是说,用 $a 的值,对比样式 ??? (3个字符的字符串)。

    但如果把行4改成:

    if [[ $a == "???" ]]; then

    那意思就不同了,此时 == 变成了是判断 $a 和 字符串 ??? 是否相等。

    linux在shell中获取时间

  • 相关阅读:
    Linked List Cycle leetcode java (链表检测环)
    Remove Duplicates from Sorted List II leetcode java
    Remove Duplicates from Sorted List leetcode java
    Merge Two Sorted Lists leetcode java
    Swap Nodes in Pairs leetcode java
    Median of Two Sorted Array leetcode java
    阿里云最便宜的四种域名注册
    nohup和&后台运行,进程查看及终止
    ipv6转ipv4 NAT64与DNS64基本原理概述
    ros使用pppoe拨号获取ipv6,并且下发IPV6的dns到客户机win7
  • 原文地址:https://www.cnblogs.com/tinywan/p/6835531.html
Copyright © 2011-2022 走看看