这个'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中是不是存在变量? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

意外的 ES6 功能“=”[重复]

在 Python 3 中异步等待方法完成

Pentaho - 如何根据 Kettle 属性文件设置工作转换

Flask 学习系列---Jinjia2使用过滤器

如何在GET上将变量从一个页面(视图)传递到另一个页面?

ansible 自定义filter plugin实现