bash / sh if语句语法

时间:2010-08-07 13:04:22

标签: linux bash

在我遇到的各种指南和脚本中,人们倾向于使用if语句的不同语法。有什么区别,什么是最佳实践?我相信以下所有陈述以及更多变体都会返回true:

bar="foo"
if [ "foo" = "foo" ]
if [[ "foo" == $bar ]]
if [ "foo" = "$bar" ]
if [[ "foo" = "$bar" ]]
if [[ "foo" -eq $bar ]]

3 个答案:

答案 0 :(得分:5)

据我了解

=期待字符串

-eq需要整数

“$ bar”用于文字匹配,即z *可以展开,但“z *”将与通配符字符匹配。

[]和[[]]之间的区别在于,在后一个单词中,拆分和路径名称扩展没有完成,但是在前者中。

加[[]]允许其他操作符:

&安培;&安培; (和), || (要么), > (String1在词法上大于String2), < (String1在词法上小于String2)

==比较运算符在双括号测试中的行为与单括号内的行为不同。

[[$ a == z *]]#如果$ a以“z”开头(模式匹配),则为真。

[[$ a ==“z *”]]#如果$ a等于z *(文字匹配),则为真。

[$ a == z *] #File globbing and word splitting。

[“$ a”==“z *”]#如果$ a等于z *(字面匹配),则为真。

查看http://tldp.org/LDP/abs/html/comparison-ops.html了解详情

答案 1 :(得分:3)

[是内置的bash,[[是一个bash关键字。如果脚本不必与其他shell兼容(例如,如果它以[[开头),则最佳做法是始终使用#!/bin/bash,并且仅使用[来兼容Bourne shell。请参阅http://mywiki.wooledge.org/BashFAQ/031

答案 2 :(得分:2)

我推荐case / esac。

case "$foo" in
  "bar" ) echo "bar";;
  *) echo "not equal";;
esac

不要担心不同的语法。