在 UNIX 中将 grep 输出连接到 echo 语句

concatenate grep output to an echo statement in UNIX

我试图在单行中输出给定路径中的目录数。我的愿望是输出这个:

X-many directories

目前,使用我的 bash 脚本,我得到了这个:

X-many

directories

这是我的代码:

ARGUMENT=

ls -l $ARGUMENT | egrep -c '^drwx'; echo -n "directories"

如何修复我的输出?谢谢

我建议

 echo "$(ls -l "$ARGUMENT" | egrep -c '^drwx') directories"

这使用 shell 的最终换行删除功能来替换命令。

不要通过管道传输到 ls 输出和计数目录,因为如果在 file/directory 名称中使用了特殊字符,您可能会得到错误的结果。

要计算目录数量,请使用:

shopt -s nullglob
arr=( "$ARGUMENT"/*/ )
echo "${#arr[@]} directories"
    glob 末尾的
  • / 将确保仅匹配 "$ARGUMENT" 路径中的目录。
  • shopt -s nullglob 是为了确保在 glob 模式失败时 return 清空结果(给定参数中没有目录)。

作为替代解决方案

$ bc <<< "$(find /etc -maxdepth 1 -type d | wc -l)-1"
116

另一个

$ count=0; while read curr_line; do count=$((count+1)); done < <(ls -l ~/etc | grep ^d); echo ${count}
116

在文件夹名称中使用空格也能正常工作

$ ls -la
total 20
drwxrwxr-x  5 alex alex 4096 Jun 30 18:40 .
drwxr-xr-x 11 alex alex 4096 Jun 30 16:41 ..
drwxrwxr-x  2 alex alex 4096 Jun 30 16:43 asdasd
drwxrwxr-x  2 alex alex 4096 Jun 30 16:43 dfgerte
drwxrwxr-x  2 alex alex 4096 Jun 30 16:43 somefoler with_space

$ count=0; while read curr_line; do count=$((count+1)); done < <(ls -l ./ | grep ^d); echo ${count}
3