使用变量简化bash脚本

时间:2012-07-09 17:30:32

标签: bash variables

我目前正在尝试简化脚本。我不想手动输入每个命令的主机名,而是希望能够使用变量?数组?某种。想知道你是否可以提供帮助。

示例:

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变量执行下面针对该特定部分中列出的主机的所有命令。

3 个答案:

答案 0 :(得分:5)

创建一个数组:

hosts=(hostname1 hostname2 hostname3)

您可以将其拆分为多行:

hosts=(
        hostname1 
        hostname2 
        hostname3
      )

迭代元素:

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

访问特定主机:

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

答案 1 :(得分:2)

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

hosts=(hostname1
       hostname2
       hostname3)

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

答案 2 :(得分: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