回显包含空格的元素的数组作为另一个命令的参数

时间:2018-10-13 10:56:34

标签: arrays bash macos echo

我正在编写一个小脚本,该脚本输出目录中的重复文件列表,即。 XXX.jpgXXX (1).jpg对。我想将此脚本的输出用作命令的参数,即ql(快速查找),以便查看所有此类图像(以确认它们确实是重复的图像,或只是文件名)。例如,我可以执行“ ql ”),这将允许我浏览所有文件“ XXX(1).jpg”;但是我想在列表中也包含原始文件“ XXX”。 jpg”文件。

到目前为止,这是我的脚本:

dups=()
for file in *\(*; do
    dups+=( "${file}" )

    breakdown=( $file )
    dupfile="${breakdown[0]}.jpg"
    if [ -e "$dupfile" ]; then
        dups+=( "$dupfile" )
    fi
done

echo ${dups[@]}

就可以构建所需文件名的数组了。但是,当涉及到诸如ql $(./printdups.sh)之类的命令时,该命令会被文件名和空格所混淆。它将尝试打开“ XXX”作为文件,然后打开“(1).jpg”作为另一个文件。所以问题是,我如何回显此数组,以便传递给我的命令能够识别带有空格的文件名?

我尝试将第3行更改为:

dups+=( "'$file'" )

并且:

dups+=( "${file/ /\ }" )

都无济于事。

1 个答案:

答案 0 :(得分:1)

您不能将数组从一个进程传递到另一个进程。您要做的只是将空格分隔的文件名序列写入标准输出,并且ql $(./printdups.sh)中未引用的命令替换失败,原因与您首先需要数组的原因相同:单词拆分不能区分文件名中的空格和文件名之间的空格。

我建议定义一个 function 而不是一个脚本,并让该函数填充一个全局数组,您可以在调用该函数后直接访问它。

get_dups () {
  dups=()
  for file in *\(*; do
    dups+=( "$file" )
    read -a breakdown <<< "$file"  # safer way to split the name into parts
    dupfile="${breakdown[0]}.jpg"
    if [ -e "$dupfile" ]; then
      dups+=( "$dupfile" )
    fi
  done
}

get_dups
ql "${dups[@]}"