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内建的一些命令,如mapfile
或read -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
可能为空。