Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux bash中的case语句替代方案_Linux_Bash_Shell_Unix_Switch Statement - Fatal编程技术网

Linux bash中的case语句替代方案

Linux bash中的case语句替代方案,linux,bash,shell,unix,switch-statement,Linux,Bash,Shell,Unix,Switch Statement,我有一个依赖于主机名的脚本。如果主机名是X,那么使用Y作为该主机的变量是一种需求 映射在一个文件中。大约有50个映射。我可以用一个case语句来解决这个问题,但是我想寻找更简单的替代方法,从文件中读取映射,而不是为所有50台服务器编写case语句 例如: 映射文件是file.txt Apple Fruit chair furniture man human pizza food 我的逻辑是: hostname=uname -n case $hostname in c

我有一个依赖于主机名的脚本。如果主机名是X,那么使用Y作为该主机的变量是一种需求

映射在一个文件中。大约有50个映射。我可以用一个case语句来解决这个问题,但是我想寻找更简单的替代方法,从文件中读取映射,而不是为所有50台服务器编写case语句

例如:

映射文件是
file.txt

Apple   Fruit
chair   furniture
man     human
pizza   food
我的逻辑是:

hostname=uname -n
case $hostname in
    chair )
        Qmgr=furniture
        rest of my code here
        ;;
    Apple )
        Qmgr=fruit
        rest of my code here
        ;;
    man )
        Qmgr=Human
        rest of my code here
        ;;
    pizza )
        Qmgr=Food
        rest of my code here
        ;;
    * )
        not recognized serer from the mappings file.txt
        ;;
esac

将数据读入关联数组

declare -A managers
while read -r host mgr; do
    managers[$host]=$mgr
done < file.txt

hostname=$(uname -n)
qmgr=${managers[$hostname]}

if [[ -z $qmgr ]]; then
    printf 'Unrecognized server %s\n' "$hostname"
fi
declare-A管理器
而read-r主机管理器;做
经理[$host]=$mgr
完成
将数据读入关联数组

declare -A managers
while read -r host mgr; do
    managers[$host]=$mgr
done < file.txt

hostname=$(uname -n)
qmgr=${managers[$hostname]}

if [[ -z $qmgr ]]; then
    printf 'Unrecognized server %s\n' "$hostname"
fi
declare-A管理器
而read-r主机管理器;做
经理[$host]=$mgr
完成
您可以将
file.txt
的内容读入关联数组,但不清楚您的
case
语句在做什么。前两种情况有意义(如果主机名与第一列匹配,则将
Qmgr
设置为文件的第二列),但后两种情况没有意义。为什么
man=human
是一种情况,而不是在
$hostname
匹配
man
时设置
Qmgr=human
?您可以将
file.txt
读入关联数组,这样您就可以编写类似
Qmgr=${managers[$(uname-n)]}
,但这不能解决
我的代码的其余部分
。我在最后两个case语句中的错误。我更正了它们。代码的其余部分是简单的构建内容(比如基于变量Qmgr构建目录),请注意,类似的代码应该从case语句中分解出来,而不是作为样板自动生成。这就是疯狂的方式。你可以将
file.txt
的内容读入一个关联数组,但不清楚你的
case
语句在做什么。前两种情况有意义(如果主机名与第一列匹配,则将
Qmgr
设置为文件的第二列),但后两种情况没有意义。为什么
man=human
是一种情况,而不是在
$hostname
匹配
man
时设置
Qmgr=human
?您可以将
file.txt
读入关联数组,这样您就可以编写类似
Qmgr=${managers[$(uname-n)]}
,但这不能解决
我的代码的其余部分
。我在最后两个case语句中的错误。我更正了它们。代码的其余部分是简单的构建内容(比如基于变量Qmgr构建目录),请注意,类似的代码应该从case语句中分解出来,而不是作为样板自动生成。这就是疯狂的方式。$mgr在这里做什么。
read
可以在文件读取时分割文件的每一行。因此,对于第一行,
host
Apple
mgr
Fruit
,等等。谢谢你的工作。一个警告是,我正在远程运行这个脚本。也就是说,脚本将在中央服务器上本地,并将在目标服务器上执行逻辑。正在尝试调整以使用远程ssh。$mgr在这里做什么。
read
可以在读取文件时拆分文件的每一行。因此,对于第一行,
host
Apple
mgr
Fruit
,等等。谢谢你的工作。一个警告是,我正在远程运行这个脚本。也就是说,脚本将在中央服务器上本地,并将在目标服务器上执行逻辑。正在尝试调整以使用远程ssh。