使用数组通过bash中的mailx附加文件

时间:2019-04-22 19:47:28

标签: arrays bash

我刚刚开始学习bash,正在从事我的第一个小项目。 我正在尝试使用数组作为参数来使用邮件附加文件,但是尽管目录中存在文件正在返回:没有这样的文件或目录

我尝试通过外壳手动键入命令以指定文件名,而无需使用数组,并且没有任何错误。

以下是代码:

在我的目录中,例如,我有File1,File2,File3。文件名将始终以“文件”开头,但是每个文件的编号都会不同。

首先,我用文件号定义一个数组:

esend=(1 2 3)

然后我遍历数组的每个迭代,并创建此数组的副本,并在每个迭代后附加-a [Filename]

# Loop over array and build the arguments for mailx.

for i in "${esend[@]}"

do

   # for each iteration append onto array with -a [filename]

   mailarray=( "${mailarray[@]}" "-a $(find -name "File$i" | sed "s|^\./||")" )

done

每个索引中的值应为“ -a File1 -a File2 -a File3”,现在我的计划是将其用作邮件的参数 < / p>

# "${mailarray[@]}"  will contain the arguments ( -a File1 -a File2 -a File3 )

echo "File being sent from mail" | mailx "${mailarray[@]}" -s "Script.sh" -r "test@test.com" test@test.com

实际结果是邮件返回File1:找不到此类文件或目录。

我在这里做错了什么,或者仅仅是我们不能使用这种方法?

1 个答案:

答案 0 :(得分:0)

在您的情况下,您需要取消引用数组变量mailarray以便将其表示为参数,否则将其表示为Bash中的一个字符串:

mailx ${mailarray[@]} -s "Script.sh" -r "test@test.com" test@test.com

但是请注意,这是危险的方式,例如任何带有特殊字符的文件都将无法正确处理。此外,您还没有处理find的多个输出。同样,使用sed删除路径也是不必要的,最好保留。

我宁愿改写成这样的东西(支持多个查找输出while循环,支持特殊字符-print0,以返回代码mailx退出):

#!/bin/bash
mailargs=()
for ((i=1;i!=4;i++))
do
  while IFS= read -r -d $'\0'
  do
    mailargs+=("-a" "${REPLY}")
  done < <(find ./ -type f -name "File${i}" -print0)
done
echo "File being sent from mail"
mailx "${mailargs[@]}" -s "Script.sh" -r "test@test.com" test@test.com
exit $?

还考虑选项,例如tar个文件。