学习阶段了解脚本。我必须在每个新系统上进行以下更改。所以我创建了这些脚本,但不幸的是它不起作用。
我想了解,如果读取用户输入并将其保存在变量中,如何在一段时间后再次使用它。就像在这个脚本中,我要求用户输入Is this a DNS Server
并what is the rev of the server
。
#!/bin/bash
echo -n "Is this a DNS Server [y n]?"
read command
if [ $command = n ]
then
yum -y install dnsmasq
yum -y install net-snmp net-snmp-utils
elif [ $command = n ]
then
echo $command
else
echo "DNS Package installation should be excluded"
fi
cat <<EOF>> scriptos.sh
!/bin/sh
export rev="avi"
export DNS_FLG="Y"
export DNS_FLG="N"
EOF
echo -n "what is the rev of the server"
read rev
if [ $rev = y ]
then
echo export LOC=$rev
if [ $rev = N ]
then
echo export DNS_FLG="Y"
if [ $rev = Y ]
then
echo export DNS_FLG="Y"
fi
echo "what your GW"
read GW
echo "what is your NW"
read NW
echo 192.168.0.0/16 via ${GW} > /etc/sysconfig/network-scripts/route-eth1
echo ${NW} via ${GW} >> /etc/sysconfig/network-scripts/route-eth1
/etc/init.d/network restart
由于以下错误,该脚本无法运行。
[root@centos6 ~]# ./script
Is this a DNS Server [y n]?y
DNS Package installation should be excluded
what is the rev of the servery
./script: line 57: syntax error: unexpected end of file
答案1
首先:编程语言对语法很挑剔。在 sh/bash 中,[
作为独立的命令(与大多数其他语言中的括号不同),因此它以及其所有参数都需要用空格分隔。因此:
if [ "$command" = y ]; then
…
elif [ "$command" = n ]; then
…
fi
第二:你的许多条件块都缺少结束符fi
。这是总是 if…then…fi
。
第三:有些提示会检查小写字母y/n
,而有些提示会检查大写字母Y/N
。你应该始终在任何地方接受相同的输入。例如:
# option 1 – make the variable lower-case
if [ "${command,,}" = y ]; then
…
# option 2 (bash-only) – use extended match
if [[ $command == @(y|Y) ]]; then
…
# option 3 (sh/bash) – use 'case' alternatives
case $command in
y|Y)
… ;;
n|N)
… ;;
esac
第四:<<EOF
重定向输入。该echo
命令不需要任何输入(仅命令行)。您可能想要使用cat <<EOF
相反,不要忘记用EOF
线来结束文本。
最后,确保将#!/bin/sh
或#!/usr/bin/env bash
标题放在所有脚本的顶部。