我刚刚开始学习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:找不到此类文件或目录。
我在这里做错了什么,或者仅仅是我们不能使用这种方法?
答案 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
个文件。