【问题标题】:How to use multiple hostnames in single bash variable?如何在单个 bash 变量中使用多个主机名?
【发布时间】:2021-09-24 04:20:28
【问题描述】:

单主机工作脚本

我在 .bashrc 中获取了以下 bash 脚本,并且在单个主机名 host1 上运行良好。 我可以毫无问题地执行 scp、rsync 和其他远程命令。 但我想将它用于多个主机名,例如。主机 1、主机 2、主机 3。

HPC_HOST=${HPC_HOST:-host1}

lastarg() {
    # get the last argument
    for last; do true; done; echo $last;
}

hpc() {
    HERE="~${PWD#$HOME}"
    ssh -t $HPC_HOST "cd $HERE; bash";
}

scp_to_hpc() {
    # Usage: scp_to_hpc files
    # Purpose: will copy file to crysden:$(pwd)/file
    #hpc_mkcwd
    HERE="~${PWD#$HOME}"
    scp $@ $HPC_HOST:$HERE
}


当前解决方案

目前我创建了相同脚本的三个副本,并根据主机名相应地修改了函数名称。

预期解决方案

我希望必须有一种方法可以在上述脚本中调用多个主机名。 并使用anyhost执行命令。(可能我们还需要为主机名定义函数变量。

我也了解在上述 bash 脚本中使用多个主机的可能想法。

【问题讨论】:

  • 你的意思是你想一次性在三台主机上运行相同的命令,还是只是概括脚本以便它不会硬编码host1
  • 顺便说一句,未引用的$@ 基本上总是一个错误;如果您有包含空格的参数,它将中断。一般来说,在寻求人工帮助之前先尝试shellcheck.net
  • @tripleee 感谢您对$@ 的建议。我会仔细看看的。目前,我设法通过将所有内容放在heredoc中并将所有函数名称更改为变量来解决我的问题,例如scp_to_hpc更改为scp_to_${hpc}。因此,对于每个主机,它都会创建单独的文件。这么晚才回复很抱歉。并感谢您的建议。

标签: bash remote-access hpc heredoc


【解决方案1】:

您可以在 bash 中使用字典,有多个键并设置值,当您想使用特定键时,您可以检索它。

创建字典 declare -A test_var

添加不带引号的键/值字符串文字 test_var[key1]=value1

用引号添加键/值字符串文字 test_var['key2']='value2'

使用 bash 变量添加键/值对

another_key_var='key3'
another_value_var='value3'
test_var[$another_key_var]=$another_value_var

在 bash 中检索键值对

echo ${test_var[key1]}
echo ${test_var[key2]}
echo ${test_var[$another_key_var]}

在 Bash 中更新字典中的现有键值 `test_var[key1]='another_value1'

在 Bash 中检查字典中是否存在键

if [ -v test_var[key1] ]; then
    echo "key1 exists in a dictionary"
fi

if [ ! -v test_var[key2] ]; then
    echo "key2 does not exists in a dictionary"
fi

在 Bash 中从字典中删除键值对

unset test_var[key1]
unset test_var['key2']
unset test_var[$another_key_var]

在 Bash 中迭代字典

for key in "${!test_var[@]}"; do
    echo "$key ${test_var[$key]}"
done

【讨论】:

  • 也许请注意,关联数组是 Bash 4+ 的功能,这意味着例如MacOS 用户仍然会使用太旧的 Bash 版本。
  • @Shaqil Ismail,非常感谢您的想法。我将在实现脚本时以这种方式查看。目前,我设法编写了一个工作脚本,但稍后我将实现它。很抱歉回复晚了,非常感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2015-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
  • 1970-01-01
相关资源
最近更新 更多