使用访问远程服务器的 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”
'
我写了一个 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” '