我的脚本:
#!/usr/bin/env bash
PATH=/home/user/example/foo/bar
mkdir -p /tmp/backup$PATH
现在我想得到"$PATH"的第一个文件夹:/home/
cd /tmp/backup
rm -rf ./home/
cd - > /dev/null
我怎么能像上面的例子一样总是检测到第一个文件夹?"dirname $PATH"只返回"/home/user/example/foo/".
提前感谢!:)
我找到了一个解决方案:
#/usr/bin/env bash
DIRECTORY="/home/user/example/foo/bar"
BASE_DIRECTORY=$(echo "$DIRECTORY" | cut -d "/" -f2)
echo "#$BASE_DIRECTORY#";
总是返回第一个目录。在这个例子中,它将返回以下内容:
#home#
感谢@condorwasabi的awk创意!:)
您可以尝试以下awk命令:
basedirectory=$(echo "$PATH" | awk -F "/" '{print $2}')
此时basedirectory
将是字符串home然后你写:
rm -rf ./"$basedirectory"/
如果PATH
总是有一个绝对的形式,你可以像
ROOT=${PATH#/} ROOT=/${ROOT%%/*}
或
IFS=/ read -ra T <<< "$PATH"
ROOT=/${T[1]}
然而,我也应该补充说,最好使用其他变量,而不是使用PATH
,因为它会改变你的二进制文件的搜索目录,除非你真的打算。
也可以选择通过readlink -f
或readlink -m
将路径转换为绝对形式:
ABS=$(readlink -m "$PATH")
你也可以参考我的函数getabspath
获取VAR的第一个目录组件:
echo ${VAR%${VAR#/*/}}
如果是VAR="/path/to/foo"
,返回/path/
解释:
${VAR#X}
去掉前缀X
并返回剩余部分。因此,如果VAR=/path/to/foo
,则/*/
匹配前缀/path/
,并且表达式返回后缀to/foo
。
${VAR%X}
去掉后缀X
。通过插入${VAR#X}
的输出,它去掉了后缀并返回前缀。
如果你能保证你的路径是正确的,这是一个方便的方法。对于某些路径,例如//path/to/foo
或path/to/foo
,它不能很好地工作,但是您可以通过进一步分解字符串来处理这种情况。
获取第一个目录:
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
纯bash:
DIR="/home/user/example/foo/bar"
[[ "$DIR" =~ ^[/][^/]+ ]] && printf "$BASH_REMATCH"
易于调整正则表达式
您可以使用dirname
…
#/usr/bin/env bash
DIRECTORY="/home/user/example/foo/bar"
BASE_DIRECTORY=$(dirname "${DIRECTORY}")
echo "#$BASE_DIRECTORY#";
输出如下…
/home/user/example/foo