我正在尝试获取完整路径目录并从中提取每个路径。例如
fullpath="/home/me/something/file"
/home/me/something/file
/home/me/something
/home/me
/home
我的尝试但是我无法弄清楚如何将这些路径排除在外。
IFS=$'/'
for i in $restorepath
do
echo $i
if [ -d $i ]; then
echo dir exists
fi
done
unset IFS
答案 0 :(得分:0)
几个问题:
unset IFS
,因为更改不会传播到父shell。如果要重新设置为默认值,以便稍后在此脚本中使用,可以将旧版本保存在某个变量中并在之后重置,或者只是将其更改为常见内容,如IFS=$'\t\n '
尝试这样的事情
#!/bin/bash
fullpath="/home/me/something/file"
IFS='/'
for i in $fullpath; do
subpath+="$i/"
if [[ -e $subpath ]]; then
echo "$subpath"
elif [[ -e ${subpath%?} ]]; then
echo "${subpath%?}" && break
else
break
fi
done
注意,${subpath%?}
会删除最后一个字符(bash中的?
=单字符通配符),以防您输入文件而不是目录作为输入。如果子路径不存在,那么打破循环也是安全的,因为这意味着它不存在后代。
答案 1 :(得分:0)
自从我做了bash脚本编写以来已经有一段时间了,这是一个完全没有经过考验的未经考验的方法,但是在不知道你想要做什么的情况下,在我看来你应该能够做到这样的事情:
fullpath="/home/me/something/file
array=(${fullpath//// })
for i in "${!array[@]}"
do
if i <= 4
echo "$i=>${array[i]}"
done
for i in "${!array[@]}"
do
if i <= 3
echo "$i=>${array[i]}"
done
for i in "${!array[@]}"
do
if i <= 2
echo "$i=>${array[i]}"
done
for i in "${!array[@]}"
do
if i <= 1
echo "$i=>${array[i]}"
done