【问题标题】:Iterate over local Map in ssh shell script在 ssh shell 脚本中迭代本地 Map
【发布时间】:2017-03-25 07:00:16
【问题描述】:

我有一个 testFile 有两个由管道分隔的参数。

vi testFile
1|A
2|B
3|C
4|D
5|E

我正在创建地图并在 for 循环中运行它,下面正在工作:

while IFS='|' read -r NUM CHAR
do
        export MAP[$NUM]=$CHAR
done < testFile

for i in ${!MAP[@]}
do
        echo "$i  ${MAP[$i]}"
done

但是当我要 ssh 到任何机器并运行循环时,得到 ./test.sh[11]: syntax error at line 20: '!' unexpected

下面不工作

ssh  someUser@someHost << EOF

for i in ${!MAP[@]}
do
        echo "$i  ${MAP[$i]}"
done

EOF

如何在 ssh 机器中使用 MAP

注意 testFile 不是固定文件,我是从每次运行时变化的 sql 查询创建此文件。

【问题讨论】:

  • someUser的登录shell是ksh吗?
  • @muru: 是的,它的 ksh shell /usr/bin/ksh
  • $ 符号被这里的字符串解释,尝试转义它。

标签: shell unix ssh ksh


【解决方案1】:

你可以试试这个;

#!/bin/ksh
while IFS='|' read -r NUM CHAR
do
        export MAP[$NUM]=$CHAR
done < testFile

for i in "${!MAP[@]}"
do
        echo "$i  "${MAP[$i]}""
done

ssh  someUser@someHost <<EOF
eval `typeset -p MAP`

for i in "\${!MAP[@]}"
do
        echo "\$i  "\${MAP[\$i]}""
done

EOF

eval : 评估服务器端

排版:允许修改变量的属性。

\$ : 转义变量

测试:

$ ksh test.ksh
1  A
2  B
3  C
4  D
5  E
user@localhost's password: 
1  A
2  B
3  C
4  D
5  E

【讨论】:

  • 感谢您的回复先生,根据您的建议进行更改后,我收到-ksh: syntax error at line 1: (' unexpected` 错误。
  • Line:1 :#!/bin/ksh 你能改变#!/usr/bin/ksh。或者删除这一行
  • 我没有使用#!/usr/bin/ksh.,但使用后出现同样的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
相关资源
最近更新 更多