使用访问远程服务器的 bash 脚本打印数组元素时出现问题

Problem to print the array elements using a bash script that access remote a server

我写了一个 bash 脚本,它只从文件夹名称中提取日期,并将提取的内容(日期)放入数组中以执行其他操作。本地工作正常,当我想在服务器上执行此远程操作时出现问题。

我通过 ssh 访问服务器,从文件夹名称中提取日期的部分工作正常,主要问题是当我想用日期填充数组时。

下面是我脚本中的一些代码:

#! bin/bash

ssh -t -t user@serveradress << 'EOT'

 # go in the path where to perform the extraction of dates
cd share/Pictures_G

 # create an array, perform the extraction of dates , populate the array with dates

declare -a all_dates

all_dates=($(ls | grep -o "[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}"))
len=${all_dates[@]}
echo "$len"
EOT

所以命令 ls | grep -o "[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}" 可以单独工作,但是当我按照我在上面的脚本中使用的方式使用它时,会提供下一个输出:

all_dates=
len=
echo

根据我的理解,没有任何东西传递给数组。

您真的需要将信息存储在数组中吗?如果没有,恕我直言,这是一个可读的解决方案:

#!/bin/bash

for file in $(find . -type f); do
  echo "File: $file";
  echo "Date: $(grep 'pattern' <<< "$file")"
done

当您通过 here documents 传递多行字符串时,文本会受到参数扩展、命令替换等的影响。

相反,考虑使用单引号定义要执行的命令(避免所有替换),然后通过 here document 传递它。由于命令不使用单引号,所以比较简单。

#! /bin/bash
CMD='

 # go in the path where to perform the extraction of dates
cd share/Pictures_G

 # create an array, perform the extraction of dates , populate the array with dates

declare -a all_dates

all_dates=($(ls | grep -o "[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}"))
len=${all_dates[@]}
echo "$len"
'
ssh -t -t user@serveradress <<EOT
    $CMD
EOT

等效方法,没有中间变量

echo '
 # PUT COMMANDS HERE
 # go in the path where to perform the extraction of dates
cd share/Pictures_G
 # MORE COMMANDS HERE
...
echo "$len"
' | ssh -t -t user@serveradress

**UPDATE 1: Parameterizing the command**

If the command line has to be parametrized to using variables in the calling script, they should be placed into double quotes, instead of single quotes. For example, if TARGET_DIR reference the remote path. Note that the single quote has to be terminated, and the variable should be placed in double quotes for safety.

TARGET_DIR=share/Pictures_G 命令=' # 进入执行日期提取的路径 CD '"$TARGET_DIR"'

#创建数组,提取日期,用日期填充数组

声明-a all_dates

all_dates=($(ls | grep -o "[0-9]{4}-[0-9]{2}-[0-9]{2}")) len=${all_dates[@]} 回声“$len” '