find
命令返回值的类型是什么?我收到了2个文件,我试图检测返回是否为数组,但检查失败。
我只想使用返回值的第一行,并试图通过检测它的数组是否使用:
local files=`find . -name *.png`
if [[ "$(declare -p $files 2>/dev/null)" =~ "declare -a" ]]; then
$files=$files[0]
fi
答案 0 :(得分:3)
没有shell命令返回数组 - 或者字符串。
UNIX命令与其他进程通信的传统方式如下:
就find
的输出而言,按惯例将其写入文件描述符#1。如何捕获该内容 - 将其存储在数组或字符串变量中,或者只是将其转储到终端 - 取决于您。
shell中内置的一些命令,例如mapfile
或read -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
可能为空。