如何在单个 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 变量中使用多个主机名?的主要内容,如果未能解决你的问题,请参考以下文章
如何在单个 C# 函数中为两个或多个不同的变量使用相同的名称? [关闭]