首页 > 解决方案 > 在 Bash 中加入带有空格的数组元素不起作用

问题描述

我正在尝试将来自远程服务器的文件列表的内容连接成一个。我的代码试图首先将它们的路径列表放入一个数组中,我成功地做到了:

day_of_week=`date +%w`
if [[ $day_of_week == 1 ]]; then
  look_back=3
else
  look_back=1
fi
DATE=$(date -d "$look_back day ago" '+%Y%m%d')
SLAP_PATH="/ns/local/data/internal/SUBM/data/SLAP_376_SUBM1/data/${DATE}/processed/"
FILES=$(ssh -tq myuser@myserver "find ${SLAP_PATH} -type f -name 'subm_*lfj_in.csv'")

文件变量:

/ns/local/data/internal/SUBM/data/SLAP_376_SUBM1/data/20200129/processed/subm_144_lfj_in.csv
/ns/local/data/internal/SUBM/data/SLAP_376_SUBM1/data/20200129/processed/subm_140_lfj_in.csv
/ns/local/data/internal/SUBM/data/SLAP_376_SUBM1/data/20200129/processed/subm_145_lfj_in.csv
(...)

所以现在我试图将每个值连接到一个名为“CMD”的字符串变量中,所以我可以尝试使用类似的东西:

cat file1 file2 file3... > final_file

问题是我无法创建文件名序列。这是我的代码:

CMD=""
for ((i = 0; i < ${#FILES[@]}; i++)); do
   #remove \n
   tmp=`echo ${FILES[$i]} | tr -d '\n'`
   #concatenate into $CMD:
   CMD="$CMD $tmp"
done
echo "This is CMD: $CMD"

每次我运行我的脚本时,这就是我得到的:

$$ ./exportReconData.sh
/ns/local/data/internal/SUBM/data/SLAP_376_SUBM1/data/20200129/processed/subm_147_lfj_in.csv44_lfj_in.csv

有什么建议么?也许有更简单的方法可以做到这一点?谢谢你。

标签: arraysbashconcatenationcat

解决方案


如果要连接文件,请执行此操作。您不需要将它们的路径放在单独的变量中:

ssh myuser@myserver "find ${SLAP_PATH} -type f -name 'subm_*lfj_in.csv' -exec cat {} +" >final_file

我也被删除-t了,ssh因为真的没有理由分配一个伪 tty。我也删除了-q,因为通常输出诊断消息是有原因的。

如果您想要final_file在远程主机上,则将重定向移动到远程执行的命令中。


推荐阅读