我的剧本:
#!/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 /"。
提前致谢! :)
答案 0 :(得分:17)
我找到了解决方案:
#/usr/bin/env bash
DIRECTORY="/home/user/example/foo/bar"
BASE_DIRECTORY=$(echo "$DIRECTORY" | cut -d "/" -f2)
echo "#$BASE_DIRECTORY#";
这将始终返回第一个目录。在此示例中,它将返回以下内容:
#home#
感谢@condorwasabi对awk的想法! :)
答案 1 :(得分:6)
如果PATH
总是有绝对形式,你可以做
ROOT=${PATH#/} ROOT=/${ROOT%%/*}
或者
IFS=/ read -ra T <<< "$PATH"
ROOT=/${T[1]}
但是我还应该补充一点,使用其他变量更好,而不是使用PATH
,因为它会改变你的二进制文件的搜索目录,除非你真的打算这样做。
您也可以选择通过readlink -f
或readlink -m
将路径转换为绝对形式:
ABS=$(readlink -m "$PATH")
您也可以参考我的函数getabspath。
答案 2 :(得分:3)
你可以尝试这个awk命令:
basedirectory=$(echo "$PATH" | awk -F "/" '{print $2}')
此时basedirectory
将是字符串 home
然后你写:
rm -rf ./"$basedirectory"/
答案 3 :(得分: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
答案 4 :(得分:0)
纯bash:
if(arg!=null && arg.length==2){
if( (arg[0].equals("10") || arg[0].equals("20") || arg[0].equals("30"))
&& (arg[1].equals("2") || arg[1].equals("4") || arg[1].equals("6")) ) {
Number data = new Number(arg[0], arg[1]);
}
else{
//Handle wrong input(s)
}
}
else{
//Handle wrong input(s)
}
易于调整正则表达式。
答案 5 :(得分:0)
您可以使用dirname
...
#/usr/bin/env bash
DIRECTORY="/home/user/example/foo/bar"
BASE_DIRECTORY=$(dirname "${DIRECTORY}")
echo "#$BASE_DIRECTORY#";
输出以下内容...
/home/user/example/foo
答案 6 :(得分:0)
获取 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
,但您可以通过进一步分解字符串来处理此类情况。