用变量简化bash脚本
我目前正试图简化脚本。而不是手动输入每个命令的主机名称,我想能够使用变量?数组?某种程度上。想知道你能否帮忙。用变量简化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变量执行下面列出的特定部分中的主机的所有命令。
创建的数组:在所述元件
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
大家都非常帮助,非常感谢! – 2012-07-09 18:37:09
Bash确实有可以迭代的数组。
hosts=(hostname1
hostname2
hostname3)
for host in "${hosts[@]}"; do
ssh -n "$host" "echo 'hello' > /tmp/test/test.txt"
done
你们所有人都非常帮助。非常感谢! – 2012-07-09 18:36:40
乐于帮助。说“谢谢”的最好方法是通过提出答案。 – jordanm 2012-07-09 18:52:59
我想我无法。我试过了。 :( – 2012-07-11 15:58:24
您可以使用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。
请注意,你想'如果[$ num_variable = 1]'等 – chepner 2012-07-09 19:05:49
是的..它是简化版本。 :)谢谢:) – 2012-07-11 15:59:23