【问题标题】:Distinguish directory name or path to the directory区分目录名称或目录路径
【发布时间】:2011-05-11 06:31:00
【问题描述】:

我有一个 shell 脚本,它采用目录名称或目录命令行路径,并创建该目录。如果我想确定参数是有效路径还是只是目录名,我该如何实现?好像传递了一个目录名,那么该目录将在执行脚本的位置创建,如果它是一个路径,那么该目录将在该路径上创建。所以这个区别对于我的脚本来说是必要的。

谢谢和问候。

【问题讨论】:

  • 为什么你甚至需要知道?当 X 只是 foo 和 /tmp/foo 时,mkdir -p X 可以正常工作
  • 根据您的描述,我认为没有任何两种不同的情况,因为目录名称是当前目录中该名称的(可能尚不存在)目录的有效路径。

标签: linux shell unix


【解决方案1】:

某些程序以不同的方式处理带有结尾“/”的参数。考虑:

./foo x

./foo x/

但是,如果适用,我会鼓励使用“标签”/“选项”,因为上面是一个非常微妙的细节,可以忽略。 (想想用户!)。

./foo -p x

./foo --path=x

./foo x

编码愉快。

【讨论】:

    【解决方案2】:

    我不确定您的意思,也不相信您需要做出这种区分:mkdir -- "$1" 会创建一个目录,无论您如何向其提供名称。

    要测试第一个参数是否是没有路径组件的简单目录名称(例如foo,但不是foo/bar 或/abso/lute),请测试它是否包含/:

    case "$1" in
      */*) echo "contains multiple path components";;
      *) echo "no slash, just a base name";;
    esac
    

    测试第一个参数是相对路径还是绝对路径,测试是否以/开头:

    case "$1" in
      /*) echo "absolute";;
      *) echo "relative";;
    esac
    

    顺便说一句,无论您是考虑文件还是目录,这都适用。

    【讨论】:

    • 谢谢。我想到了 arg.contains('/')。比如,x=abc 和 y=$(echo $x | grep [/]) 然后 echo ${#y} 返回 0。
    【解决方案3】:
    dir=$(dirname -- "$1")
    
    if test "$dir" != '.'; then
        echo 'Path'
    else
        echo 'Directory'
    fi
    

    【讨论】:

    • @Gilles 和@Timofey Stolbov 感谢你们俩。这项技术正在奏效。你能告诉我你为什么使用 dirname -- "$1" 而不是 dirname $1 吗?我在互联网上没有找到任何资源,也许我没有使用正确的搜索查询,要知道 test 命令的这种特殊用法,你能解释一下或指向一些网站吗?
    • @Tapas:如果参数可能以- 开头,则-- 是必需的,否则dirname 会将其解释为一个选项。如果参数包含特殊字符(空格或\[?*),则需要双引号,否则shell 会将其拆分为单词并进行通配符(通配符匹配)。一般规则:始终在变量替换周围加上双引号。
    • @Timofey:我认为您的代码没有达到预期的效果。例如,它将./foo 视为“目录”,与foo 相同。
    • @Tapas:只需查看test 手册 (man test) 或您的 shell 手册(test 是几乎每个 shell 中的内置命令)。这个表单测试$dir和.这两个字符串是否不同。
    • @Gilles 据我了解,脚本不得在当前目录中创建另一个目录。因此将foo 和./foo 视为相同大小写是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    相关资源
    最近更新 更多