如何编写shell脚本来查找当前路径的深度?
假设我在:
/home/user/test/test1/test2/test3
它应该返回6.
答案 0 :(得分:5)
使用shell参数扩展,没有外部命令:
$ var=${PWD//[!\/]}
$ echo ${#var}
6
第一个扩展会移除所有不是/
的字符;第二个打印var
的长度。
有关POSIX shell或Bash支持的详细说明(括号中的链接转到POSIX标准或Bash手册中的相应部分):
$PWD
包含当前工作目录的路径。 (sh / Bash) ${parameter/pattern/string}
扩展会在 pattern
的扩展中替换第一次出现的 parameter
{{1 }} 的。 (Bash)
string
为空,则 string
之后的斜杠是可选的(如我们的情况)。pattern
是一个括号表达式,代表“斜杠以外的任何字符”。 (sh / Bash)
[!\/]
,否则会被解释为结束模式。\/
作为括号表达式中的第一个字符否定表达式:任何字符其他而不是表达式中的字符匹配模式。 POSIX sh需要支持!
,并且表示使用!
的行为未定义; Bash支持^
和!
。请注意,这不是正则表达式中的括号表达式,只有^
有效。^
扩展为 ${#parameter}
的长度。 (sh / Bash) 答案 1 :(得分:5)
鱼的简单方法:
count (string split / $PWD)
答案 2 :(得分:2)
您可以计算当前路径中的斜杠数:
pwd | awk -F"/" '{print NF-1}'
答案 3 :(得分:1)
假设你没有跟踪" /",你可以算上" /"。
所以你会
删除所有不是" /"
计算结果字符串的长度
在鱼类中,这可以通过类似
的方式完成string replace --regex --all '[^/]' '' -- $PWD | string length
正则表达式 - [^/]
匹配每个不是" /"的字符。使用" - all",这将尽可能频繁地完成,并将其替换为''
,即没有。
--
是选项分隔符,因此参数中的任何内容都不会被解释为一个选项(否则,如果参数以&#34开头,则会出现问题; -a")
$PWD
是当前目录。
string length
只输出其输入的长度。
答案 4 :(得分:1)
您可以使用管道执行此操作。使用-o选项将字符串输入grep。这打印出每个" /"在一条新线上。管道再次进入wc -l计算打印的行数。
echo "$path_str" | grep -o '/' - | wc -l
答案 5 :(得分:0)
使用perl:
echo '/home/user/test/test1/test2/test3' |
perl -lne '@_ = split /\//; print scalar @_ -1'
6
答案 6 :(得分:0)
您可以像这样使用find
:
find / -printf "%d %p\n" 2>/dev/null | grep "$PWD$" | awk '{print $1}'
也许不是最有效的,但处理斜杠很好。