ºìÁªLinuxÃÅ»§
Linux°ïÖú

дshellʾÀý

·¢²¼Ê±¼ä:2008-02-03 20:44:08À´Ô´:ºìÁª×÷Õß:ntenance
×÷Õߣºjunky

ϲ»¶linux²»ÊÇÒ»Á½ÌìÁË£¬Ô­ÒòÌ«¶àÎҾͲ»ËµÁË¡£ËùÒÔ¶ÔlinuxµÄ¶«¶«¶¼Ï²»¶È¥³¢ÊÔһϡ£¶ø×÷ΪlinuxµÄÒ»ÖֺܿáµÄÈË»ú½»»¥½Ó¿Úshell£¬Ò²ÊǺÜˬµÄ¡£µ±È»£¬¶Ôlinux£¬ÎÒÒ²Ö»ÄÜËãÒ»²ËÄñ¡£

¿´ÎÒдµÄ½Å±¾£º¹þ¹þ¡££¨Ã»ÓÐд¹ýºÜ³¤µÄ½Å±¾£¬»ù±¾ÉϾÍÊǰÑËûµ±CÀ´ÓÃÁË£¬µ«ËüÓÖûÓÐCµÄһЩ¹¦ÄÜ¡£¸ßÊÖĪЦ£©Ã»ÓÐ×¢ÊÍ¡£[code]#!/bin/sh
#file: gen-cmd.sh
#generate the cmd line for console

#need a config file. for example:
#config file: cmd.conf (not contain the '#')
#string:create mac_based_vlan mac_address 00-00-00-00-::
#number:10:11:
#string:-::
#number:10:11:
#string: vlan default::

#./gen-cmd.sh -f cmd.conf -o cmd.txt
#then cmd.txt is: (not contain the '#')
#create mac_based_vlan mac_address 00-00-00-00-10-10 vlan default
#create mac_based_vlan mac_address 00-00-00-00-11-11 vlan default

#./gen-cmd.sh -f cmd.conf -o cmd.txt -l
#then cmd.txt is: (not contain the '#')
#create mac_based_vlan mac_address 00-00-00-00-10-10 vlan default
#create mac_based_vlan mac_address 00-00-00-00-10-11 vlan default
#create mac_based_vlan mac_address 00-00-00-00-11-10 vlan default
#create mac_based_vlan mac_address 00-00-00-00-11-11 vlan default


CONFIG_FILE=""
CMD_FILE=""
LINE[1]=""
NUMBER_START[1]=""
NUMBER_START_BACKUP[1]=""
NUMBER_END[1]=""
EOF_SIGN="__EOF__"

LAST_COMMAND[1]=""

ITEM_COUNTER=0
LINE_COUNTER=0

LOOP_IN_LOOP=0

print_version()
{
echo "
*************************************************
generate the cmd line for console
---------------------
Version 1.0
*************************************************"
}

__print()
{
echo $*
}

__exit()
{
UKOWN_ERROR=-1
if [ -n "$1" ]; then
echo "$1"
if [ -n "$2" ]; then
exit $2
else
exit ${UKOWN_ERROR}
fi
else
echo "unkown error"
exit ${UKOWN_ERROR}
fi
}

__help()
{
echo "
Usage: gen-cmd.sh {-l} {-h} {-f config-file} { -o output-file}"
exit $1
}

__trace()
{
TRACE_COUNTER=$[TRACE_COUNTER+1];
if [ -n "$1" ]; then
echo Trace $1! Counter is ${TRACE_COUNTER}
else
echo Trace here! Counter is ${TRACE_COUNTER}
fi
}

load_param()
{
echo "Prameter number:$#, content:$*"

CONFIG_FILE="cmd.conf" #default value
CMD_FILE="cmd.txt"
LOOP_IN_LOOP=0

while [ $# -ne 0 ]; do
case $1 in
-f) CONFIG_FILE=$2
shift;shift;;
-o) CMD_FILE=$2
shift;shift;;
-l) LOOP_IN_LOOP=1;
shift;;
-h) __help;;
*) __print "Illegal Option: $1"
__help
esac
done

echo "Config file: ${CONFIG_FILE}; Output file: ${CMD_FILE}"
echo

if [ ! -f "${CONFIG_FILE}" ]; then
__exit "Can not find the config file: ${CONFIG_FILE}"
fi

if [ ! -r "${CONFIG_FILE}" ]; then
__exit "Permission deny, can not read config file: ${CONFIG_FILE}"
fi

>${CMD_FILE}

if [ ! -w "${CMD_FILE}" ]; then
__exit "Permission deny, can not write output file: ${CMD_FILE}"
fi
}

read_line()
{
ITEM_COUNTER=$[ITEM_COUNTER+1];
LINE_COUNTER=$[LINE_COUNTER+1];
line_temp=$(sed -n "${LINE_COUNTER}p" ${CONFIG_FILE} | sed 's/[\r\n]//')

while [ 1 ]; do
if [ "${line_temp}" = "" ]; then
LINE[$ITEM_COUNTER]=${EOF_SIGN} #do not use this string in command
ITEM_COUNTER=$[ITEM_COUNTER-1];
return
fi

local_temp=$(echo -n ${line_temp} | sed 's/ //')

if [ "${local_temp:0:1}" != "#" ]; then
break
fi

echo "Skip @ line ${LINE_COUNTER}: ${line_temp}"

LINE_COUNTER=$[LINE_COUNTER+1];
line_temp=$(sed -n "${LINE_COUNTER}p" ${CONFIG_FILE} | sed 's/[\r\n]//')
done

LINE[$ITEM_COUNTER]=${line_temp}

local_temp=$(echo -n "${line_temp}"|awk -F'[:]' '{print $1}')

if [ "${local_temp}" = "string" ]; then
local_temp=$(echo -n ${line_temp} | awk -F'[:]' '{print $2}')
if [ "${local_temp}" = "" ]; then
__exit "Invlid format @ line ${LINE_COUNTER}: ${local_temp}"
fi
LINE[$ITEM_COUNTER]=${local_temp}
echo "String format @ line ${LINE_COUNTER}:${local_temp}"

read_line

ITEM_COUNTER=$[ITEM_COUNTER-1];
return
elif [ "${local_temp}" != "number" ]; then
__exit "Invlid format @ line ${LINE_COUNTER}: ${local_temp}"
fi

#number format

NUMBER_START[$ITEM_COUNTER]=$(echo -n ${line_temp} | awk -F'[:]' '{print $2}')
NUMBER_END[$ITEM_COUNTER]=$(echo -n ${line_temp} | awk -F'[:]' '{print $3}')

NUMBER_START[$ITEM_COUNTER]=$[${NUMBER_START[$ITEM_COUNTER]}+0] #convert to number
NUMBER_END[$ITEM_COUNTER]=$[${NUMBER_END[$ITEM_COUNTER]}+0] #convert to number
LINE[$ITEM_COUNTER]=""

echo "Number format @ line ${LINE_COUNTER}: start:${NUMBER_START[$ITEM_COUNTER]}, end:${NUMBER_END[$ITEM_COUNTER]}"

read_line

ITEM_COUNTER=$[ITEM_COUNTER-1];
return
}

gen_cmd()
{
ITEM_COUNTER=$[ITEM_COUNTER+1];
local_temp=${LINE[$ITEM_COUNTER]}

if [ "${local_temp}" = "${EOF_SIGN}" ]; then
ITEM_COUNTER=$[ITEM_COUNTER-1];
echo ${LAST_COMMAND[$ITEM_COUNTER]} >> ${CMD_FILE}
return
fi

if [ -n "${local_temp}" ]; then #string format
LAST_COMMAND[$ITEM_COUNTER]="${LAST_COMMAND[$ITEM_COUNTER-1]}${local_temp}"
gen_cmd
ITEM_COUNTER=$[ITEM_COUNTER-1];
return
fi

#number format

if [ ${LOOP_IN_LOOP} == 1 ]; then
NUMBER_START_BACKUP[ITEM_COUNTER]=${NUMBER_START[$ITEM_COUNTER]}

while [ ${NUMBER_START[$ITEM_COUNTER]} -le ${NUMBER_END[$ITEM_COUNTER]} ]; do
LAST_COMMAND[$ITEM_COUNTER]="${LAST_COMMAND[$ITEM_COUNTER-1]}${NUMBER_START[$ITEM_COUNTER]}"
gen_cmd
NUMBER_START[$ITEM_COUNTER]=$[NUMBER_START[$ITEM_COUNTER]+1]
done

NUMBER_START[ITEM_COUNTER]=${NUMBER_START_BACKUP[$ITEM_COUNTER]}
elif [ ${NUMBER_START[$ITEM_COUNTER]} -le ${NUMBER_END[$ITEM_COUNTER]} ]; then
LAST_COMMAND[$ITEM_COUNTER]="${LAST_COMMAND[$ITEM_COUNTER-1]}${NUMBER_START[$ITEM_COUNTER]}"
gen_cmd
NUMBER_START[$ITEM_COUNTER]=$[NUMBER_START[$ITEM_COUNTER]+1]
else #all loops are done!
echo
echo
__exit "sucess" 0
fi

ITEM_COUNTER=$[ITEM_COUNTER-1];
return
}

# SHELL BEGINS ! MAIN ENTRY !!!

print_version

load_param $*

read_line

echo
echo -n "Generating command ... please wait ... "

if [ ${LOOP_IN_LOOP} -eq 0 ]; then
while [ 1 ]; do
gen_cmd
done
else
gen_cmd
fi

echo
echo

__exit "sucess" 0[/code]
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 1 ÌõÆÀÂÛ

  1. grzrt ÓÚ 2008-02-05 10:19:03·¢±í:

    ¶àÏòÂ¥Ö÷ѧϰ ÎÒ¸Õ¿ªÊ¼Ñ§Ï°linux
    ¹þ