如何编写一个shell脚本来查找当前路径的深度?
假设我在以下目录中:
/home/user/test/test1/test2/test3
应该返回6。
如何编写一个shell脚本来查找当前路径的深度?
假设我在以下目录中:
/home/user/test/test1/test2/test3
使用 shell 参数扩展,无需使用外部命令:
$ var=${PWD//[!\/]}
$ echo ${#var}
6
/
的字符;第二个扩展打印出 var
的长度。
$PWD
包含当前工作目录的路径。(sh/Bash)${parameter/pattern/string}
扩展将 parameter
中第一次出现的 pattern
替换为 string
。(Bash)
string
为空,则 pattern
后面的斜杠是可选的(如我们的情况)。[!\/]
是一个括号表达式,表示“除斜杠外的任何字符”。(sh/Bash)
\/
,否则它将被解释为结束模式。!
表示否定该表达式:除了表达式中的字符外,任何字符都匹配该模式。POSIX sh 要求支持 !
并且指出使用 ^
的行为未定义;Bash 支持 !
和 ^
。请注意,这不是正则表达式中看到的括号表达式,其中只有 ^
是有效的。${#parameter}
扩展为 parameter
的长度。(sh/Bash)[!\/]
吗?我不太了解这种情况下的 !
。最简洁的方式加1分 :) 也许您可以补充一下哪些 shell 可以执行此操作。 - Gilles Quénot!
作为否定字符是 POSIX 所要求的,而 ^
的行为是未定义的;Bash 支持 !
和 ^
。我会添加更多信息。 - Benjamin W.count (string split / $PWD)
pwd | awk -F"/" '{print NF-1}'
您可以使用管道来完成这个操作。将字符串输入grep,并使用-o选项。这会将每个“/”打印到新行上。再次使用管道将其输入到wc -l中,以计算打印的行数。
echo "$path_str" | grep -o '/' - | wc -l
$path_str
,否则如果你的字符串包含 Globbing 字符,就可能会遇到令人讨厌的意外情况。顺便说一下,POSIX 要求 $PWD
,所以你可以使用它。 - Benjamin W.$path_str
,你需要为其分配当前路径。你可以使用环境变量$PWD
,如果一个shell想要符合POSIX标准,那么这个变量是必须存在的,因为它是一个兼容性标准。 - Benjamin W.所以您需要:
删除除“/”以外的所有内容
计算结果字符串的长度
在fish中,可以使用以下代码完成此操作:
string replace --regex --all '[^/]' '' -- $PWD | string length
正则表达式 - [^/]
匹配除了 "/" 以外的任何字符。使用 "--all",这将尽可能多地进行匹配,并用 ''
替换,即什么也不做。
--
是选项分隔符,以便不将参数中的任何内容解释为选项(否则如果参数以 "-a" 开头,则会出现问题)。
$PWD
是当前目录。
string length
只是输出其输入的长度。
set length(string replace --regex --all '[^/]' '' -- $PWD | string length); if test $length -lt 7
。 - faho使用perl:
echo '/home/user/test/test1/test2/test3' |
perl -lne '@_ = split /\//; print scalar @_ -1'
6
find
:find / -printf "%d %p\n" 2>/dev/null | grep "$PWD$" | awk '{print $1}'
可能不是最高效的方法,但能很好地处理斜杠。