【问题标题】:Shell: test if parameter is a directoryShell:测试参数是否为目录
【发布时间】:2013-06-02 10:43:40
【问题描述】:

人们帮助我用很少的代码对参数进行排序 但是现在我想检查一下这个参数是不是一个目录。

   if [ -d "$@" ]
   then
     echo "$@" | tr ' ' '\n' | sort
   else
     echo this is not a valid map!
   fi

通常检查某些东西是否是您需要使用的目录[ -d file ] 但这次不行。

如果您有任何想法或解决方案,请免费发布! Ty 阅读/帮助!

【问题讨论】:

  • 嗯……如果没记错的话,您的脚本将许多字符串作为参数。那么,目录应该是什么?
  • [ -d file ] 是你要做的。这怎么行不通?
  • 两个答案都没有提到这一点:[ -d "$@" ] 仅在您的脚本只接收一个参数时才有效——"$@" 替换 all 参数的引用内容——所以如果你的脚本收到foo bar baz,你会说[ -d "foo" "bar" "baz" ]——当然,test 不知道如何处理这些额外的参数,并且会因为消息test: too many arguments 而失败。您想要"$1" - 仅第一个参数 - 或迭代"$@",如当前答案所示。

标签: shell directory


【解决方案1】:
for f in "$@"; do
    if [ ! -d "$f" ]; then
        echo "Not a dir: $f"
    fi
done

此代码将遍历所有参数并输出那些不是有效目录的参数。但我不确定你现在要排序。

【讨论】:

    【解决方案2】:

    扩展 kirelagin 的建议:

    for f in "$@"; do
        if [ ! -d "$f" ]; then
            echo "Not a dir: $f" >&2
        else
            echo "$f"
        fi
    done | sort
    

    这会将所有非目录参数回显到stderr,并在stdout 上打印目录的排序列表。

    【讨论】:

    • 这真的很有趣,但如果可能的话我还有 1 个问题,如果他发现一个不是目录的项目,我想打破我的代码,当我把“Break”放在回声下它行不通。你知道如何解决这个问题吗?
    • 你可以exit 代替,或者代替回显目录名称,你可以将它们存储在一个新列表中。然后在验证所有输入后处理新列表。
    猜你喜欢
    • 2014-03-01
    • 2011-04-17
    • 2013-01-10
    • 2011-10-14
    • 2014-01-12
    • 2016-07-27
    • 2012-09-20
    • 2014-09-23
    • 1970-01-01
    相关资源
    最近更新 更多