我正在阅读关于if的bash示例,但有些示例是用单方括号编写的:
if [ -f $param ]
then
#...
fi
其他带双方括号:
if [[ $? -ne 0 ]]
then
start looking for errors in yourlog
fi
有什么区别?
用于条件试验的单支架内(即[…]),所有shell都支持一些操作符,如single,而一些旧shell不支持使用操作符。
用于条件测试的双支架内(即[…]),在旧的或新的shell中使用与使用没有区别。
编辑:我还应该注意:在bash中,始终使用双括号[[…]如果可能,因为它比单支架更安全。我将用以下示例说明原因:
if [ $var == "hello" ]; then
如果$var恰好为null/空,则脚本会看到:
if [ == "hello" ]; then
这会破坏你的剧本。解决方案是要么使用双括号,要么始终记住在变量周围加引号(“$var”
)。双括号是更好的防御性编码实践。
行为差异
在Bash 4.3.11中测试:
>
POSIX vs Bash扩展:
常规命令vs魔法
>
只是[
的最后一个参数。
实际上,Ubuntu 16.04在coreutils提供的可执行文件中有一个可执行文件,但bash内置版本优先。
Bash解析命令的方式没有任何改变。
特别是,<代码>
>
[[X]]
是一个单一的构造,可以神奇地解析X
<代码>
还有进一步的区别,如=
和=~
。
在Bashese中:[
是一个内置命令,而[[/code>是一个关键字:https://askubuntu.com/questions/445749/whats-the-difference-between-shell-builtin-and-shell-keyword
<代码>
[a
<代码>
<代码>[[a=a
(
<代码>[[(a=a | | a=b)
扩展时的分词和文件名生成(拆分glob)
x='a b'; [[ $x='a b']]
:正确,不需要引用
x='a b';[$x='a b']
:语法错误,扩展为[a b='a b']
x='*'; [ $x='a b']
:如果当前目录中有多个文件,则语法错误。 x='a b'; [ "$x"='a b']
: POSIX等效
<代码>=
[[ab=a?]]
: true,因为它进行模式匹配(* ? [
很神奇)。不会全局扩展到当前目录中的文件。
[ab=a?]
:a?
全局扩展。因此,根据当前目录中的文件,可能是真或假。 [ab=a\?]
:假,不是全局扩展 =
和==
在[
和[[
中是相同的,但==
是Bash扩展。 (a?)回声匹配中的case ab;esac
:POSIX等效 [[ab=~'ab?' ]]
: false,在Bash 3.2及更高版本的"
中失去魔力,并且未启用与bash 3.1的兼容性(如BASH_COMPAT=3.1
) [[ab?=~'ab?' ]]
: true
<代码>=~
<代码>[[ab=~ ab?]]
:true,POSIX扩展正则表达式匹配,
不全局展开
建议:始终使用
我所看到的每一个构造都有POSIX等价物。
如果您使用
失去便携性
- 强迫读者学习另一个bash扩展的复杂性。
[
只是一个名字奇怪的常规命令,不涉及特殊的语义学。
感谢Stéphane Chazelas的重要更正和补充。
Single是符合posix shell的条件测试。
Double是标准的扩展,由bash和其他shell(例如zsh、ksh)支持。它们支持额外的操作(以及标准的posix操作)。例如:|
而不是-o和与
=~
匹配的正则表达式。在bash手册的条件构造部分可以找到更完整的差异列表。
只要您希望脚本可以跨shell移植,就可以使用脚本。如果希望条件表达式不受
[[]]支持且不需要可移植,请使用。
问题内容: 我对以下代码行的语法感到困惑: 数据框对象由2列(“大脑”和“身体”)组成 当我打印x_values时,我得到这样的东西: 就dataframe对象的属性和方法而言,我知道pandas文档,但双括号语法使我感到困惑。 问题答案: 考虑一下: 来源DF: 选择一列-生成Pandas.Series: 选择DataFrame的子集-结果为DataFrame: 结论: 第二种方法允许我们从Da
问题内容: 我是bash脚本的新手,使用双括号时遇到问题。我似乎无法让它们在Ubuntu Server 11.10中完全正常工作。我下面的脚本在if_test.sh中。 当我运行此简单的shell脚本时,输出为:if_test.sh:5:[[:找不到 从终端运行bash –version后,似乎正在运行GNU bash 4.2.10。任何帮助将不胜感激。谢谢! 问题答案: 问题出在脚本调用上。您正
问题内容: 我对这个尖角世界是陌生的,我对使用双花括号{{}}和单花括号{}感到困惑,或者有时不使用花括号来包含指令中的表达式 问题答案: {{}}-双大括号: 是Angular表达式,当您希望将内容编写为HTML时非常方便: 不要在已经是表达式的地方使用它们! 例如,该指令将引号之间的任何内容都视为一个表达式: {}-大括号: 我们知道JavaScript代表对象。这里也没有什么不同: 使用一些
这两个numpy对象有什么区别?
这里我理解哈希(#)符号将定义为本地模板变量,但是前面的星号是什么意思呢?还有,有必要吗? 下面是使用括号的示例: 我有点理解周围的括号将它绑定到HTML属性/Angular指令。这是否意味着它们是Angular计算表达式的指针?就像是Angular 1中的的等价物? 我猜真正的问题是,这些符号在Angular 2中有特殊的含义吗,知道何时使用每一个的最简单的方法是什么?谢谢!!
本文向大家介绍浅析python 中大括号中括号小括号的区分,包括了浅析python 中大括号中括号小括号的区分的使用技巧和注意事项,需要的朋友参考一下 python语言最常见的括号有三种,分别是:小括号( )、中括号[ ]和大括号也叫做花括号{ }。其作用也各不相同,分别用来代表不同的python基本内置数据类型。 1.python中的小括号( ):代表tuple元组数据类型,元组是一种不可变序列