在 Bash 中使用 space 加入数组元素不起作用
Join array elements with space in Bash not working
我正在尝试将来自远程服务器的文件列表的内容连接成一个。我的代码试图首先将它们的路径列表获取到一个数组中,我成功地做到了:
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
有什么建议吗?也许有更简单的方法来做到这一点?谢谢。
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'"))
如果你想连接文件,那就这样做吧。您不需要将它们的路径放在单独的变量中:
ssh myuser@myserver "find ${SLAP_PATH} -type f -name 'subm_*lfj_in.csv' -exec cat {} +" >final_file
我还从 ssh
中删除了 -t
,因为确实没有理由分配伪 tty。我还删除了 -q
,因为通常输出诊断消息是有原因的。
如果你想要远程主机上的final_file
,那么将重定向移动到远程执行的命令中。
我正在尝试将来自远程服务器的文件列表的内容连接成一个。我的代码试图首先将它们的路径列表获取到一个数组中,我成功地做到了:
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
有什么建议吗?也许有更简单的方法来做到这一点?谢谢。
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'"))
如果你想连接文件,那就这样做吧。您不需要将它们的路径放在单独的变量中:
ssh myuser@myserver "find ${SLAP_PATH} -type f -name 'subm_*lfj_in.csv' -exec cat {} +" >final_file
我还从 ssh
中删除了 -t
,因为确实没有理由分配伪 tty。我还删除了 -q
,因为通常输出诊断消息是有原因的。
如果你想要远程主机上的final_file
,那么将重定向移动到远程执行的命令中。