2012-07-09 97 views
1

我目前正试图简化脚本。而不是手动输入每个命令的主机名称,我想能够使用变量?数组?某种程度上。想知道你能否帮忙。用变量简化bash脚本

例子: “有没有写这个更简单的方法”

hostname1=192.168.1.1 
hostname2=192.168.1.2 

echo "What would you like to do?" 
echo "(1)Ping Hosts" 
echo "(2)mkdir /tmp/test" 
echo "(3)write to test.txt" 
read num_variable 

if num_variable = 1 
then 
ping hostname1 
ping hostname2 

if num_variable = 2 
ssh -n hostname1 "mkdir /tmp/test" 
ssh -n hostname2 "mkdir /tmp/test" 

if num_variable = 3 
ssh -n hostname1 "echo 'hello' > /tmp/test/test.txt" 
ssh -n hostname2 "echo 'hello' > /tmp/test/test.txt" 

例子:

Hosts=hostname1,hostname2 

命令吗?

我不想拥有20,000行,当我所能做的就是列出主机名在顶部,并为每个num变量执行下面列出的特定部分中的主机的所有命令。

+0

请注意,你想'如果[$ num_variable = 1]'等 – chepner 2012-07-09 19:05:49

+0

是的..它是简化版本。 :)谢谢:) – 2012-07-11 15:59:23

回答

5

创建的数组:在所述元件

hosts=(
     hostname1 
     hostname2 
     hostname3 
    ) 

迭代:

for host in "${hosts[@]}" 
do 
    echo "$host" 
done 

访问特定宿主

hosts=(hostname1 hostname2 hostname3) 

可以将其分割为多行:

echo "${hosts[2]}" 

使用select命令创建一个菜单:

PS3='Please enter your choice: ' 
options=("Option 1" "Option 2" "Option3" "Quit") 
select opt in "${options[@]}" 
do 
    echo "Opt: $opt, Reply: $REPLY" 
    case $opt in 
     "Option 1") 
      echo "you chose choice 1" 
      ;; 
     "Option 2") 
      echo "you chose choice 2" 
      ;; 
     "Option 2") 
      echo "you chose choice 3" 
      ;; 
     "Quit") 
      break 
      ;; 
     *) echo invalid option;; 
    esac 
done 
+0

大家都非常帮助,非常感谢! – 2012-07-09 18:37:09

2

Bash确实有可以迭代的数组。

hosts=(hostname1 
     hostname2 
     hostname3) 

for host in "${hosts[@]}"; do 
    ssh -n "$host" "echo 'hello' > /tmp/test/test.txt" 
done 
+1

你们所有人都非常帮助。非常感谢! – 2012-07-09 18:36:40

+0

乐于帮助。说“谢谢”的最好方法是通过提出答案。 – jordanm 2012-07-09 18:52:59

+0

我想我无法。我试过了。 :( – 2012-07-11 15:58:24

0

您可以使用for环路和case声明。

一个for循环的一个例子是:

nodes="192.168.1.1 192.168.1.2 192.168.1.3" 
for node in $nodes 
do 
    echo $node 
done 

一个case声明的一个例子是

case "$num_variable" in 
    "1") echo "1";; 
    "2") echo "2";; 
    "3") echo "3";; 
esac 

结合使用这两种是你的一个锻炼:-)

bash的一个很好的参考是Advanced Bash-Scripting Guide

+0

如果代码可以移植到其他POSIX shell中,这将是一个好方法。 – jordanm 2012-07-09 18:54:54

+0

@jordanm嗨,可移植代码有什么问题?我认为应该是这样的要成为一件好事物...... – 2012-07-09 19:21:37

+0

限制自己使用POSIX-only功能会导致维护代码变得越来越难以维护并且越来越困难。我们大多数人在Linux泡沫里面真的不在乎我们的代码是否会在* bsd机器上运行,而是更愿意使用扩展功能。 – jordanm 2012-07-09 19:53:21