20

My script:

    #!/usr/bin/env bash
    PATH=/home/user/example/foo/bar
    mkdir -p /tmp/backup$PATH

And now I want to get first folder of "$PATH": /home/

    cd /tmp/backup
    rm -rf ./home/
    cd - > /dev/null

How can I always detect the first folder like the example above? "dirname $PATH" just returns "/home/user/example/foo/".

Thanks in advance! :)

4

7 回答 7

33

我找到了一个解决方案:

    #/usr/bin/env bash
    DIRECTORY="/home/user/example/foo/bar"
    BASE_DIRECTORY=$(echo "$DIRECTORY" | cut -d "/" -f2)
    echo "#$BASE_DIRECTORY#";

这总是返回第一个目录。在此示例中,它将返回以下内容:

    #home#

感谢@condorwasabi 提出的关于 awk 的想法!:)

于 2014-07-09T18:49:47.783 回答
6

如果PATH总是有一个绝对的形式,你可以做一些技巧,比如

ROOT=${PATH#/} ROOT=/${ROOT%%/*}

或者

IFS=/ read -ra T <<< "$PATH"
ROOT=/${T[1]}

但是我还应该补充一点,最好使用其他变量而不是使用PATH它,因为它会改变二进制文件的搜索目录,除非你真的打算这样做。

您也可以选择通过readlink -for将您的路径转换为绝对形式readlink -m

ABS=$(readlink -m "$PATH")

也可以参考我的函数getabspath

于 2014-07-08T12:33:22.657 回答
5

你可以试试这个 awk 命令:

 basedirectory=$(echo "$PATH" | awk -F "/" '{print $2}')

此时basedirectory将字符串home 然后你写:

rm -rf ./"$basedirectory"/
于 2014-07-08T12:39:03.203 回答
1

获得第一个火药:

path=/home/user/example/foo/bar
mkdir -p "/tmp/backup$path"
cd /tmp/backup
arr=( */ )
echo "${arr[0]}"

PS:切勿在脚本中使用 PATH 变量,因为它会覆盖默认 PATH 并且您的脚本将无法执行许多系统实用程序

编辑:可能这对你有用:

IFS=/ && set -- $path; echo "$2"
home
于 2014-07-08T12:35:52.463 回答
1

获取 VAR 的第一个目录组件:

echo ${VAR%${VAR#/*/}}

因此,如果VAR="/path/to/foo",则返回/path/

解释:

${VAR#X}去掉前缀X并返回余数。所以 if VAR=/path/to/foo, then/*/匹配前缀/path/并且表达式返回后缀to/foo

${VAR%X}去掉后缀X。通过插入 的输出${VAR#X},它会去掉后缀并返回前缀。

如果您可以保证您的路径格式正确,这是一种方便的方法。它不适用于某些路径,例如//path/to/fooor path/to/foo,但您可以通过进一步分解字符串来处理这种情况。

于 2021-07-29T20:56:34.753 回答
0

纯重击:

DIR="/home/user/example/foo/bar"
[[ "$DIR" =~ ^[/][^/]+ ]] && printf "$BASH_REMATCH"

易于调整正则表达式。

于 2018-08-05T18:16:39.873 回答
0

你可以使用dirname...

#/usr/bin/env bash
DIRECTORY="/home/user/example/foo/bar"
BASE_DIRECTORY=$(dirname "${DIRECTORY}")
echo "#$BASE_DIRECTORY#";

输出以下...

/home/user/example/foo
于 2020-05-18T00:33:47.573 回答