查找bash命令返回值类型



find命令返回值的类型是什么?我正在接收2个文件,我试图检测返回是否是数组,但检查失败。

我只想使用返回值的第一行,并试图通过使用

检测它是否为数组来做到这一点:
local files=`find . -name *.png`
if [[ "$(declare -p $files 2>/dev/null)" =~ "declare -a" ]]; then
    $files=$files[0]
fi

没有shell命令返回数组——或者字符串。

UNIX命令与其他进程通信的常规方式如下:

  • 命令行参数和环境变量在启动时可用来指定行为。
  • 从文件描述符#0,"stdin"读取输入
  • 输出被写入文件描述符#1,"stdout"
  • 供人类使用的日志和消息被写入文件描述符#2,"stderr"
  • 当命令完成时,它以一个整数"exit status"结束,表示它是否成功。

对于find的输出,按照约定将其写入文件描述符#1。如何捕获该内容—将其存储在数组或字符串变量中,或者只是将其转储到终端—取决于您。

shell内建的一些命令,如mapfileread -a可以创建数组作为副作用,但这些是副作用而不是返回值。

在bash中安全地将find返回的文件列表读入数组(POSIX sh没有数组,因此不能在以#!/bin/sh开头的脚本中使用):

#!/bin/bash
arr=( )
while IFS= read -r -d '' filename; do
  arr+=( "$filename" )
done < <(find . -name '*.png' -type f -print0)

之后,您可以使用"${arr[@]}"展开数组:for file in "${arr[@]}"; do ...printf -- '- %qn' "${arr[@]}"是两个示例。

同样,您可以简单地引用"$arr"(或"${arr[0]}")来获取数组中的第一个元素,或者引用"${#arr[@]}"来获取数组的长度。

要确保find最多打印一个结果,您可以这样做:

find /path/to/dir -name 'name_pattern' -print -quit

操作依次执行,因此打印第一个匹配(如果有的话),然后程序退出。

要将输出保存在变量中,可以使用var=$(find ...)。注意:如果没有匹配的文件,var可能为空。

最新更新