主要问题:
编写一个脚本来确定相对于文件系统根的路径深度。该路径作为命令行上的参数接收。如果未收到参数,则将当前工作目录视为路径。如果参数不是有效路径,则会将错误消息打印到 stderr 并返回非零退出状态。其他错误情况(例如没有足够的权限读取给定路径)应以类似的方式处理。如果成功,脚本应将深度打印到标准输出并返回 0。
我知道如何处理错误情况,但我的主要问题是找到路径的深度。我正在考虑将给定路径保存为字符串并计算“/”幽灵的数量。我发现我可以使用以下命令来做到这一点:
grep -o "/" $PWD | wc -l
但即使我更改多个目录,它也会显示 1。我还在学习 shell 脚本,所以你能给我详细的解决方案吗?
答案1
grep -o "/" $PWD
会将 的内容PWD
作为要读取的文件的名称。这看起来应该会给你一个错误,因为在许多系统上,你无法像读取文件一样读取目录。 (除了在某些系统中您仍然可以,但内容在这里不会很有用。)
而是使用printf "%s\n" "$PWD" | grep -o / | wc -l
.在 ksh/Bash/zsh/yash 中,您可以使用内置替换运算符删除除斜杠之外的任何内容,然后计算字符数:s=$PWD; s=${s//[^\/]}; num=${#s}
使用zsh
,您可以将其缩短为num=${#PWD//[^\/]}
。
或者,使用标准工具:printf %s "$PWD" | LC_ALL=C tr -dc / | wc -c
.
答案2
您的帖子 ( ) 中的命令grep -o "/" $PWD | wc -l
将尝试使用 grep$PWD
作为目标,而不是组成该路径的字符串。
为了达到你想要的效果,你可以这样做echo $PWD | grep -o "/" | wc -l
。
作为替代方案,由于目标是找到路径的深度,因此您可以计算该路径中的目录数量,而不是正斜杠的数量。
例如:
echo "$PWD" | tr " /" "- " | wc -w
tr
将所有空格转换为“-”字符,将所有“/”转换为空格。wc -w
然后计算先前输出中的单词数。这可以确保每个目录仅算作一个单词,即使它们的名称中包含空格。此外,由于我们没有计算“/”的数量,因此检查根目录的深度将表明深度为 0。
示例1:
$ pwd /tmp/test directory $ echo "$PWD" | tr " /" "- " | wc -w 2
示例2:
$ pwd / $ echo "$PWD" | tr " /" "- " | wc -w 0
答案3
grep -o "/" <<< "$PWD" | wc -l
您需要将工作目录重定向回 grep,然后打印行数。
答案4
要计算路径中“/”的数量只需使用以下命令。经测试,效果很好
命令
echo "$PWD" | awk '{print gsub("/","",$0)}'
输出
@praveen t1]#
pwd
/tmp/p1/t1
[root@praveen t1]#echo "$PWD" | awk '{print gsub("/","",$0)}'
3
[根@praveen