查找bash命令的返回值类型

时间:2016-09-13 12:31:46

标签: bash

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

我只想使用返回值的第一行,并试图通过检测它的数组是否使用:

local files=`find . -name *.png`

if [[ "$(declare -p $files 2>/dev/null)" =~ "declare -a" ]]; then
    $files=$files[0]
fi

2 个答案:

答案 0 :(得分:3)

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

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

  • 命令行参数和环境变量在启动时可用于指定行为。
  • 从文件描述符#0,“stdin”
  • 读取输入
  • 输出被写入文件描述符#1,“stdout”
  • 人工消费的记录和消息被写入文件描述符#2,“stderr”
  • 当命令完成时,它以一个整数“退出状态”终止,表示它是否成功。这就是该命令可以说是“返回”。

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

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

安全地将find返回的文件列表读入bash中的数组(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 -- '- %q\n' "${arr[@]}"就是两个例子。

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

答案 1 :(得分:2)

要确保find最多打印一个结果,您可以执行以下操作:

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

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

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