【问题标题】:bash function - why doesn't it workbash 函数 - 为什么它不起作用
【发布时间】:2015-04-11 22:57:12
【问题描述】:

我一直试图让它工作一段时间,但我仍然对它为什么不起作用感到困惑。我正在尝试向我的 bashrc 添加一个函数,以 cd 到下一个包含文件或多个目录的目录。但我不能让这个文件测试工作,我不明白这个问题。寻找 。 -maxdepth 1 -type f 在我将它输入终端时有效,但在这里它似乎不起作用。并且 -z 应该测试它是否为空,当我在空目录中调用它时应该是它。但它只是返回每次检测到的文件......它是在doFilesExist中使用点运算符吗?

function cdwn(){
    # check if there are files or multiple directories in current wd
    doFilesExist="find . -maxdepth 1 -type f"
    if [ -z '$doFilesExist' ]; then
        echo "no files  detected"
    else
        echo "files detected"
    fi
}

谢谢大家,似乎正在使用以下内容:

function cdwn(){
    # check if there are files or multiple directories in current wd
    doFilesExist=`find . -maxdepth 1 -type f`
    if [ -z "$doFilesExist" ]; then
        echo "no files  detected"
    else
        echo "files detected"
    fi
}

但我不满意,因为我不明白为什么会出现问题,您能否建议一些我可以遵循的指南以更好地理解?过去的事情我显然要么忘记了,要么不明白!

【问题讨论】:

  • [ -z $var ] 检查变量 var 是否已设置。在您的情况下,var 中有一个字符串,所以它总是被设置。 -- BTW 在使用一元比较时添加双引号 ([ ... ])。
  • ...所以你需要双引号来解释$doFileExist的值,否则它只会检查字符串$doFilesExist而不是它的值:[ -z "$doFilesExist" ]
  • 顺便说一句,您可以[也] 将解决您的问题的答案标记为已接受,而不是编辑帖子说“嘿,这有效”。通过这种方式,未来的访问者可以清楚地知道您的问题已经解决给未来的读者
  • 抱歉,以后一定会选择答案

标签: bash function terminal


【解决方案1】:

看起来像错误的引号。将 bash 命令的结果放入变量中:

doFilesExist=$(find . -maxdepth 1 -type f)

doFilesExist=`find . -maxdepth 1 -type f`

if 块的部分也要改成[ -z "$doFilesExist" ]: “在单引号字符串中,除了关闭引用的单引号外,什么都没有(!!!!)被解释”source

【讨论】:

  • 其实你可以说if [ -z "$(find ... )" ],不需要使用变量。
  • 哈哈,这个不错!可能变得难以阅读,但这绝对是我见过的最短的 find 命令之一。所以那里没问题。
  • 事实上,是的。我已经标记了要重写的地方。你的建议是一个很好的步骤。要了解它的工作原理,您可以阅读Command substitution
【解决方案2】:

您应该尝试以下方法:

function cdwn(){
    # check if there are files or multiple directories in current wd
    files=$(find . -maxdepth 1 -type f | wc -l)
    if [[ ${files} -gt 0 ]]; then
        echo "files detected"
    else
        echo "no files detected"
    fi
}

不要使用-z 进行检查,因为它会检查是否设置了变量,它没有说明大小。此外,您只是将命令存储为字符串,它从未被执行过。要执行它,您可以像其他一些答案所建议的那样将内容存储在一个变量中,但这些变量可能会变得非常大。

【讨论】:

  • 写入文件有点矫枉过正
  • 而不是将其全部放入变量中?
  • 好吧,也许是这样,我可能会删除这个答案。
  • 嗯,这很有趣,但不像我那样做。请注意,如果某些文件名包含新行,则计算find 管道到wc -l 的结果数可能会导致错误(这很奇怪,但它可能会发生!)。但在这种情况下,它会有所帮助,是的。事实上,我只想说if [ -z "$(find ...)" ] 来摆脱变量和一切。
  • 是的,因为它是一个子外壳导出也没有帮助。所以基本上我不得不求助于写入文件,这样就完成了循环,哈哈。无论如何,感谢您的提示和指示,学习总是很高兴!
猜你喜欢
  • 2019-02-16
  • 2020-04-04
  • 1970-01-01
  • 2017-11-28
  • 1970-01-01
  • 2014-08-06
  • 2015-02-20
  • 2021-08-20
  • 2021-07-25
相关资源
最近更新 更多