Bash shell脚本中的双括号问题
我有一个执行的shell脚本。在脚本中,我有:Bash shell脚本中的双括号问题,bash,shell,Bash,Shell,我有一个执行的shell脚本。在脚本中,我有: if [[ $variable == *something* ]]; then do something fi 我这里的问题是,运行脚本会返回“[[notfound]” 从阅读其他答案来看,似乎并非所有shell都能识别双括号,但是,我不确定解决方案是什么,该代码的等价物是什么?听起来您的shell是POSIXsh,它没有[[内置。可能的解决方案包括将其转换为适用于sh的表达式,或将shebang行更改为#!/bin/bash。更改sheb
if [[ $variable == *something* ]]; then
do something
fi
我这里的问题是,运行脚本会返回“[[notfound]”
从阅读其他答案来看,似乎并非所有shell都能识别双括号,但是,我不确定解决方案是什么,该代码的等价物是什么?听起来您的shell是POSIX
sh
,它没有[[
内置。可能的解决方案包括将其转换为适用于sh
的表达式,或将shebang行更改为#!/bin/bash
。更改shebang通常是最佳解决方案
你可能有一个POSIX
sh
如果你在Ubuntu上,他们使用dash。我只知道一个括号,你试过每个括号都只有一个吗?
否则,您可以使用
test
。POSIX标准溶液:
if test echo "${variable}" | grep -q 'something'
then
# do something
fi
这将始终有效:)您是否在bash下执行此脚本?将#!/bin/bash添加到顶部当我将#!/bin/bash添加到顶部时,它将永远执行。我无法控制脚本的执行,我只是将它放在某个地方(在网页上),然后它将被拾取并执行。请看一下,这可能会对您的意思是测试有所帮助[$variable==something];?我不确定“test”的作用是什么?
test
脚本是否等同于[],有关更多信息和一些示例,请参阅在单方括号内无法进行LOB样式比较。表达式将展开为匹配文件名的列表。test“$variable”=something
,相反,引号很重要,并且支持==
是GNU扩展,不可移植。此外,这不会以[[
]的方式测试全局匹配
version有。当我将#!/bin/bash添加到顶部时,它将永远执行。我无法控制脚本的执行,我只是将它放在某个地方(在网页上)它会被拾取和执行。@ USE22075:然后你在脚本中有一个无限循环。SeBang-Load本身不会让它无限运行。你应该考虑用脚本打开一个新的问题来找出问题所在。改变SeBon通常是最糟糕的解决方案。l、 @williampersell:我不同意。目前,bash对大多数用户来说都是非常可移植的。如果你是一个小群体,这还不够,你就会知道。人们编写的大多数脚本都被他们调用的第三方实用程序渲染为不可移植的,那么为什么要让它们更难阅读和维护,这样它们才能运行呢在一个系统上,他们从未打算与之一起使用?@Daenyth使事物在他们从未打算与之一起使用的系统上工作是一个极其重要的设计目标。如果人们以设计者从未打算过的方式使用工具,那么工具是最有用的。+1,但我不确定它是否会一直工作。特别是,“*”可能是全局的;)-1、 test
不支持glob匹配,因此它的工作方式与bash等价物的工作方式不同。@CharlesDuffy:不必如此,因为if echo“${variable}”|grep“glob”
因为可以使用正则表达式,所以工作得更好。你看,我解释的*某些东西*
不是上面的glob表达式,而是
的占位符。它确实不能做globs,但它是POSIX标准,随着DASH等的出现,这一点变得越来越重要。@djhaskin987我确实解释了*something*
作为一个glob——在没有明确说明的情况下,将一个问题的一部分解释为在给出它的技术上下文中有其字面意义以外的东西是一厢情愿的想法。至于“破折号的出现”,这只有当人们使用#!/bin/sh
来制作他们的shebang时才重要,如果他们想要POSIX sh中没有的功能,就不应该这样做。谢谢你的评论。我编辑了这个解决方案来省略globing,它在测试中不起作用。这应该会产生用户想要的效果,现在它将永远起作用。