`

[转] shell中&&和||的使用方法

阅读更多
shell中&&和||的使用方法
&&运算符:
 
command1  && command2
 
&&左边的命令(命令1)返回真(即返回0,成功被执行)后,&&右边的命令(命令2)才能够被执行;换句话说,“如果这个命令执行成功&&那么执行这个命令”。 
语法格式如下:
 
    command1 && command2 [&& command3 ...]
 
1 命令之间使用 && 连接,实现逻辑与的功能。
2 只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令才会被执行。
3 只要有一个命令返回假(命令返回值 $? == 1),后面的命令就不会被执行。
 
示例 1
malihou@ubuntu:~$ cp ~/Desktop/1.txt ~/1.txt && rm ~/Desktop/1.txt && echo "success"
 
示例 1 中的命令首先从 ~/Desktop 目录复制 1.txt 文件到 ~ 目录;执行成功后,使用 rm 删除源文件;如果删除成功则输出提示信息。
 
||运算符:
command1 || command2
 
||则与&&相反。如果||左边的命令(命令1)未执行成功,那么就执行||右边的命令(命令2);或者换句话说,“如果这个命令执行失败了||那么就执行这个命令。
1 命令之间使用 || 连接,实现逻辑或的功能。
2 只有在 || 左边的命令返回假(命令返回值 $? == 1),|| 右边的命令才会被执行。这和 c 语言中的逻辑或语法功能相同,即实现短路逻辑或操作。
3 只要有一个命令返回真(命令返回值 $? == 0),后面的命令就不会被执行。
 
示例 2
malihou@ubuntu:~$ rm ~/Desktop/1.txt || echo "fail"
 
在示例 2 中,如果 ~/Desktop 目录下不存在文件 1.txt,将输出提示信息。
 
示例 3
malihou@ubuntu:~$ rm ~/Desktop/1.txt && echo "success" || echo "fail"
 
在示例 3 中,如果 ~/Desktop 目录下存在文件 1.txt,将输出 success 提示信息;否则输出 fail 提示信息。
如果希望把几个命令合在一起执行, s h e l l提供了两种方法。既可以在当前s h e l l也可以在子s h e l l中执行一组命令。
 
()运算符:
为了在当前shell中执行一组命令,可以用命令分隔符(即",")隔开每一个命令,并把所有的命令用圆括号()括起来。 
它的一般形式为: 
        ( 命令;命令;命令… )
 
1 一条命令需要独占一个物理行,如果需要将多条命令放在同一行,命令之间使用命令分隔符(;)分隔。执行的效果等同于多个独立的命令单独执行的效果。
2 () 表示在当前 shell 中将多个命令作为一个整体执行。需要注意的是,使用 () 括起来的命令在执行前面都不会切换当前工作目录,也就是说命令组合都是在当前工作目录下被执行的,尽管命令中有切换目录的命令。
3 命令组合常和命令执行控制结合起来使用。
 
示例 4
malihou@ubuntu:~$ rm ~/Desktop/1.txt || (cd ~/Desktop/;ls -a;echo "fail")
 
在示例 4 中,如果目录 ~/Desktop 下不存在文件 1.txt,则执行命令组合。
 
{}运算符:
如果使用{}来代替(),那么相应的命令将在子shell而不是当前shell中作为一个整体被执行,只有在{}中所有命令的输出作为一个整体被重定向时,其中的命令才被放到子shell中执行,否则在当前shell执行。
它的一般形式为: 
      { 命令;命令;命令… } 
(注意:在使用{}时,{}与命令之间必须使用一个空格)
 
测试: 
~$ A=1;echo $A;{ A=2; };echo $A 
 
~$ A=1;echo $A;( A=2; );echo $A 
--------------------------------------------------------------------------
1楼 leteye 2014-10-23 11:31发表 [回复]
()的作用描述有问题:
()应该是在子shell中执行,而不是当前shell。
()子shell中可以继承父shell的变量,但是子shell中修改的变量不会影响父shell。
 

shell 十三問?

7) ( ) 與 { } 差在哪?
嗯,這次輕鬆一下,不講太多...  ^_^

先說一下,為何要用 ( ) 或 { } 好了。
許多時候,我們在 shell 操作上,需要在一定條件下一次執行多個命令,
也就是說,要麼不執行,要麼就全執行,而不是每次依序的判斷是否要執行下一個命令。
或是,需要從一些命令執行優先次順中得到豁免,如算術的 2*(3+4) 那樣...
這時候,我們就可引入"命令群組"(command group)的概念:將多個命令集中處理。

在 shell command line 中,一般人或許不太計較 ( ) 與 { } 這兩對符號的差異,
雖然兩者都可將多個命令作群組化處理,但若從技術細節上,卻是很不一樣的:
( ) 將 command group 置於 sub-shell 去執行,也稱 nested sub-shell。
{ } 則是在同一個 shell 內完成,也稱為 non-named command group。
若,你對上一章的 fork 與 source 的概念還記得了的話,那就不難理解兩者的差異了。
要是在 command group 中扯上變量及其他環境的修改,我們可以根據不同的需求來使用 ( ) 或 { } 。
通常而言,若所作的修改是臨時的,且不想影響原有或以後的設定,那我們就 nested sub-shell ,
反之,則用 non-named command group 。

是的,光從 command line 來看,( ) 與 { } 的差別就講完了,夠輕鬆吧~~~  ^_^
然而,若這兩個 meta 用在其他 command meta 或領域中(如 Regular Expression),還是有很多差別的。
只是,我不打算再去說明了,留給讀者自己慢慢發掘好了...
我這裡只想補充一個概念,就是 function 。
所謂的 function ,就是用一個名字去命名一個  command group ,然後再調用這個名字去執行 command group 。
從 non-named command group 來推斷,大概你也可以猜到我要說的是 { } 了吧?(yes! 你真聰明﹗  ^_^ )

在 bash 中,function 的定義方式有兩種:
方式一:
  1. function function_name {
  2.     command1
  3.     command2
  4.     command3
  5.     ....
  6. }
复制代码

方式二:
  1. fuction_name () {
  2.     command1
  3.     command2
  4.     command3
  5.     ....
  6. }
复制代码

用哪一種方式無所謂,只是若碰到所定意的名稱與現有的命令或別名(Alias)衝突的話,方式二或許會失敗。
但方式二起碼可以少打 function 這一串英文字母,對懶人來說(如我),又何樂不為呢?...  ^_^

function 在某一程度來說,也可稱為"函式",但請不要與傳統編程所使用的函式(library)搞混了,畢竟兩者差異很大。
惟一相同的是,我們都可以隨時用"已定義的名稱"來調用它們...
若我們在 shell 操作中,需要不斷的重覆質行某些命令,我們首先想到的,或許是將命令寫成命令稿(shell script)。
不過,我們也可以寫成 function ,然後在 command line 中打上 function_name 就可當一舨的 script 來使用了。
只是若你在 shell 中定義的 function ,除了可用 unset function_name 取消外,一旦退出 shell ,function 也跟著取消。
然而,在 script 中使用 function 卻有許多好處,除了可以提高整體 script 的執行效能外(因為已被載入),
還可以節省許多重覆的代碼...

簡單而言,若你會將多個命令寫成 script 以供調用的話,那,你可以將 function 看成是 script 中的 script ...  ^_^
而且,透過上一章介紹的 source 命令,我們可以自行定義許許多多好用的 function ,再集中寫在特定文件中,
然後,在其他的 script 中用 source 將它們載入並反覆執行。
若你是 RedHat Linux 的使用者,或許,已經猜得出 /etc/rc.d/init.d/functions 這個文件是作啥用的了~~~  ^_^

okay,說要輕鬆點的嘛,那這次就暫時寫到這吧。祝大家學習愉快﹗  ^_^
分享到:
评论

相关推荐

    shell实现netmask掩码和cidr掩码位转换1

    因此,在实际应用中,我们应该尽量使用这个技术来提高我们的工作效率和生产力。 附加知识点 * Netmask 掩码是一种用于确定子网掩码的方法。 * CIDR 掩码位是一种用于确定子网掩码的方法。 * Shell 是一种 Unix ...

    linux shell 实现IP和数字的转换

    在Linux系统中,Shell脚本是一种强大的工具,用于自动化任务执行和系统管理。当我们需要处理与网络相关的任务,如IP地址的转换时,Shell脚本能够提供方便且灵活的解决方案。IP地址通常有两种形式:点分十进制(例如...

    Shell转换成C

    这个过程主要是利用一种工具,例如`shc`(Shell to C Compiler),它能够将Bash或其它Shell脚本转化为C源代码,从而使得原始的Shell命令和变量在最终的二进制文件中不以明文形式存在,达到一定的加密效果。...

    [Ubuntu.Linux.基础视频教程].4.3.Shell.类型转换

    3. 数字转字符串:虽然在Shell中,数字可以直接当作字符串使用,但如果你想明确地将数字转换为字符串,可以使用`printf`命令,如`printf "%s\n" $number`。 4. 数组操作:如果你有一个字符串,想要将其拆分为数组,...

    Linux&SHELL;基本知识笔试试卷

    - **知识点**:在 Linux 中执行 SHELL 脚本,可以使用以下几种方法: - 使用 `source $shell_script` 或 `.$shell_script` 来在当前 shell 中执行脚本。 - 使用 `sh $shell_script` 或 `./$shell_script` 来在一个...

    linux shell实现求一个多维数组中的最大和最小值

    本文将详细介绍如何使用 Linux Shell 来找出一个包含多个一维数组的多维数组中的最大值和最小值。 #### 核心知识点: 1. **Shell 数组的定义与使用** 2. **Shell 脚本中的循环结构** 3. **条件判断与变量赋值** 4....

    Android执行shell命令(转)

    在Android系统中,有时我们需要执行一些底层操作,如文件管理、系统调试或自动化测试,这时候就需要用到shell命令。本文将深入探讨如何在Android平台上执行shell命令,以及它在实际开发中的应用。 首先,Android...

    shell 编程指南pdf

    14.4.1 在脚本中使用位置参数 142 14.4.2 向系统命令传递参数 142 14.4.3 特定变量参数 143 14.4.4 最后的退出状态 144 14.5 小结 145 第15章 引号 146 15.1 引用必要性 146 15.2 双引号 146 15.3 单引号 147 15.4 ...

    LINUX与UNIX SHELL编程指南(很全)

    14.4.1 在脚本中使用位置参数 142 14.4.2 向系统命令传递参数 142 14.4.3 特定变量参数 143 14.4.4 最后的退出状态 144 14.5 小结 145 第15章 引号 146 15.1 引用必要性 146 15.2 双引号 146 15.3 单引号 147 15.4 ...

    使用Linux-Shell转换PDF文件为图片

    通过编写Shell脚本,我们可以执行一系列命令来批量处理PDF转图片的任务。 描述中提到的"封装好的jar包、sh文件及使用说明",这是转换过程中的关键组件。`convert-pdf.jar`很可能是一个Java编写的可执行程序,它实现...

    EFI shell命令工具IA32和X64版本

    只需在脚本文件中列出所需命令,然后在Shell中使用`run`命令执行即可。 总的来说,EFI Shell提供了一个强大的平台,使得系统维护、硬件调试和UEFI固件升级变得更加直观和便捷。了解和掌握这些工具的使用,对于IT...

    shell脚本的介绍与教学

    ### Shell脚本的介绍与教学 #### shell概览与作用 **shell脚本**是一种用于自动化...以上是shell脚本的基础介绍及部分核心知识点的详解,通过学习和实践这些内容,可以帮助用户更好地利用shell脚本来提升工作效率。

    shell的使用和编程

    通过学习Shell的基础使用方法和编程技巧,可以极大地提高工作效率。 #### 二、命令的使用 在Linux系统中,命令是进行各种操作的基础。命令的一般格式为: ``` Command[-options][arguments] ``` - **Command**:指...

    LINUX与UNIX SHELL编程指南 高清PDF

    14.4.1 在脚本中使用位置参数 142 14.4.2 向系统命令传递参数 142 14.4.3 特定变量参数 143 14.4.4 最后的退出状态 144 14.5 小结 145 第15章 引号 146 15.1 引用必要性 146 15.2 双引号 146 15.3 单引号 147 15.4 ...

    Linux与unix shell编程指南

    19.6 在shell中使用函数 204 19.7 创建函数文件 204 19.8 定位文件 205 19.9 检查载入函数 205 19.10 执行shell函数 205 19.10.1 删除shell函数 206 19.10.2 编辑shell函数 206 19.10.3 函数举例 207 19.10.4 将函数...

    Unix Shell by Example.zip

    《Unix Shell by Example》这本书是Unix/Linux系统用户和管理员的重要参考资料,它深入浅出地介绍了Unix Shell的使用方法。Shell是Unix系统中的命令解释器,是用户与操作系统交互的桥梁,通过Shell脚本,我们可以...

    Shell十三问-ChinaUnix精华贴整理2007.pdf

    &&和||分别表示逻辑与和逻辑或,在Shell脚本中用于控制流程的分支和条件判断。熟练运用这两个运算符,可以构建出更复杂的逻辑结构。 ### 12. >与<的输入输出重定向 >和<分别用于输出重定向和输入重定向,使Shell...

    shellAdvanced.docx教程

    Shell是Linux和Unix操作系统中的一个命令解释器,它允许用户通过命令行与操作系统进行交互。在更高级的层面上,Shell还是一个编程语言,能够编写称为Shell脚本的程序,这些脚本可以自动化一系列的系统操作。对于运维...

    shell编程和unix命令

    14.4.1 在脚本中使用位置参数 142 14.4.2 向系统命令传递参数 142 14.4.3 特定变量参数 143 14.4.4 最后的退出状态 144 14.5 小结 145 第15章 引号 146 15.1 引用必要性 146 15.2 双引号 146 15.3 单引号 147 15.4 ...

Global site tag (gtag.js) - Google Analytics