这个'if [ -e $MY_VARIABLE ]'是不是检查linux中是不是存在变量? [复制]
Posted
技术标签:
【中文标题】这个\'if [ -e $MY_VARIABLE ]\'是不是检查linux中是不是存在变量? [复制]【英文标题】:Does this 'if [ -e $MY_VARIABLE ]' check if a variable exists in linux? [duplicate]这个'if [ -e $MY_VARIABLE ]'是否检查linux中是否存在变量? [复制] 【发布时间】:2021-11-20 13:18:46 【问题描述】:我正在查看一个 bash 脚本,其中包含这样的语句:
if [ -e $MY_VARIABLE ]
-e 参数有什么作用?它是否检查变量是否存在?
【问题讨论】:
man test
告诉您test
或[
的每个选项的作用。为每一个这样的标志设置一个单独的堆栈溢出问题是不合理的,更不用说有人可能推测标志所做的每一个可能的事情。
【参考方案1】:
if [ -e $MY_VARIABLE ]
不检查变量是否存在。 (为此,请使用$MY_VARIABLE?
或$MY_VARIABLE+
(或:?
和:+
),具体取决于您想要做什么。)
[
命令永远不会看到字符串MY_VARIABLE
。 shell 解析字符串$MY_VARIABLE
并将其扩展传递给[
。如果 MY_VARIABLE 未设置(或者是空字符串),shell 调用命令 [ -e ]
并测试字符串 -e
是否为空(不是)。如果 MY_VARIABLE 已设置且非空,则 [
会使用一些参数执行。如果 MY_VARIABLE 不包含任何空格(更准确地说,如果它不包含 IFS 中的值),则 [
正好看到 3 个参数(-e
、$MY_VARIABLE
的扩展值和 ]
)并检查如果文件系统中存在第二个参数命名的路径。如果 MY_VARIABLE 确实包含 IFS 的元素,那么 [
会获得超过 3 个参数,并且(可能)会发出一条错误消息,抱怨意外的参数。 (如果 $MY_VARIABLE 进行字段拆分,则不一定是错误。例如,如果 $MY_VARIABLE 扩展为字符串/ -a -e /etc
,则将使用参数-e
,/
调用[
, -a
、-e
、/etc
和 ]
将检查文件系统中是否存在 /
和 /etc
。)
上面描述的大部分行为都被正确地认为是晦涩难懂的,并且是最佳实践鼓励使用双引号的主要原因之一; if [ -e "$MY_VARIABLE" ]
是检查 $MY_VARIABLE 中命名的文件是否存在的首选方法之一。
【讨论】:
[ -e ]
不是错误——它等同于[ -n "-e" ]
,检查字符串-e
是否为非空(始终保证为非空),因此始终为真。跨度>
@CharlesDuffy 啊,是的。谢谢。已编辑。【参考方案2】:
如果这应该是一个 shell 脚本,那么它是无效的。 if test -e "$MY_VARIABLE"
或 if [ -e "$MY_VARIABLE" ]
。 -e
本身是一个无效命令,但 test
/[
二进制文件有这样的选项。
-e
检查文件是否存在。来自man page:
-e
文件 文件存在
注意。始终引用您的变量,否则您的脚本将无法(正确)运行,或者如果变量的值扩展为几个单词(换一种说法:您的变量包含空格),您的脚本可能会执行意外操作
【讨论】:
我忘了括号但没有双引号坐是这样的:if [ -e $MY_VARIABLE ] @DataCoder,省略双引号会导致问题严重——你不知道[
的参数将扩展到多少。你可以有像MY_VARIABLE='thing-that-does-not-exist -o 1 = 1'
这样的东西,因此用引号扩展将是真的,因为1 = 1
是真的,即使-e thing-that-does-not-exist
是假的。【参考方案3】:
否 此命令检查是否存在任何类型的文件。您的变量可能是带有文件路径的字符串?
打印出变量的值,看看是不是路径。
【讨论】:
这是它应该做的,但由于缺少引号,它的实际行为更有趣/令人惊讶。例如:在空字符串的情况下,它只是测试-e
是否是一个非空字符串,它是,所以它总是返回true。在它是合法文件名但其中包含空格的情况下,行为取决于这些空格每一侧的内容,但大多数情况下结果将是测试语法错误。然后你会遇到像nonexistent-thing -o 1 = 1
这样的情况,其中不存在这样的文件,但无论如何结果都是真的。以上是关于这个'if [ -e $MY_VARIABLE ]'是不是检查linux中是不是存在变量? [复制]的主要内容,如果未能解决你的问题,请参考以下文章