如何在单个 bash 变量中使用多个主机名?

Posted

技术标签:

【中文标题】如何在单个 bash 变量中使用多个主机名?【英文标题】:How to use multiple hostnames in single bash variable? 【发布时间】: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。因此,对于每个主机,它都会创建单独的文件。这么晚才回复很抱歉。并感谢您的建议。 【参考方案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,非常感谢您的想法。我将在实现脚本时以这种方式查看。目前,我设法编写了一个工作脚本,但稍后我将实现它。很抱歉回复晚了,非常感谢您的建议。

以上是关于如何在单个 bash 变量中使用多个主机名?的主要内容,如果未能解决你的问题,请参考以下文章

Python中如何正确命名变量,有规律吗?

如何在单个 C# 函数中为两个或多个不同的变量使用相同的名称? [关闭]

当你进入远程系统时,如何在屏幕上显示主机名?

如何使用单个查询获取存储在不同变量中的多个表行的计数?

如何在 GET 方法中为 Spring Boot 控制器类传递多个路径变量?

如何在Ansible中使用静态和动态库存