在Bash中使用空格连接数组元素不起作用

时间:2020-01-30 18:25:03

标签: arrays bash concatenation cat

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

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'")

FILES变量:

/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

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

2 个答案:

答案 0 :(得分:0)

FILES不是数组。要创建数组,您需要将()放在赋值中:

IFS=$'\n\r' # so spaces won't delimit array elements
FILES=($(ssh -tq myuser@myserver "find ${SLAP_PATH} -type f -name 'subm_*lfj_in.csv'"))

答案 1 :(得分:0)

如果要串联文件,请这样做。您不需要在单独的变量中指向它们的路径:

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

我也从-t中删除了ssh,因为实际上没有理由分配伪tty。我还删除了-q,因为诊断消息通常是出于某种原因而输出。

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