====== Ejemplo de bash script ====== URL: [[http://motte.codigolibre.net/]] **mysql2motte.sh:** #!/bin/bash # Motte MySQL2Class Generator # PHP Class Generator based on MySQL database structure # Authors: Pedro Gauna: pgauna@gmail.com, Carlos Gagliardi: carlosgag@gmail.com, # Jose Dodero: jose.dodero@gmail.com, GBoksar\/Perro: gustavo@boksar.info), # Pablo Erartes: pabloeuy@gmail.com, # LinuxTeros: http://linuxteros.codigolibre.net/mottte, INDT Sistemas: http://www.indt.hc.edu.uy # License: GPLv2+ (http://opensource.org/licenses/gpl-license.php GNU Public license) # Link: http://motte.codigolibre.net # Last update: Wed Set 12 09:09:48 UYT 2007 # VERBOSE=0 INCREMENTAL=0 DBUSER="" DBPASS="" DBHOST="" DBNAME="" DBHOSTPORT="" DBHOST="" CLSPATH="." TBLSTRUCT="" TPLFILE="" PACKAGE="motte_project" LICENSE="GPLv2+" VERSION="1.0" FUNCSERIAL="" # finish # if a message is received the program finishes # function finish { eraseTmp VERBOSE=1 if [ "$1" == "help" ]; then shift message "$1" 1 message "MySQL2Motte - Mysql database parser for automagic creation of classes" message "Motte v1.0 \nThis program is licensed under GPLv2+(http://opensource.org/licenses/gpl-license.php GNU Public license)\n\nAuthors:\tPedro Gauna, Carlos Gagliardi, Jose Dodero, GBoksar/Perro, Pablo Erartes" 1 message "Parameters: (order is irrelevant)\n\tOptionals:\n\t\t-v or --verbose\n\t\t-i or --autoincremental\n\t\t-o= or --output= \n\t\t-t= or --template= \t(If none specified default Motte class template will be used)\n\t\t\tVariables to be replaced on template:\n\t\t\t\t@AUTHOR\t\tApplication authors.\n\t\t\t\t@URL\t\tApplication URL.\n\t\t\t\t@PACKAGE\tApplication package name.\n\t\t\t\t@DATE\t\tDate/time when class was created.\n\t\t\t\t@TBLSTRUCT\tOriginal DB table structure for the class.\n\t\t\t\t@INCLUDES\tOther classes needed for foreign keys validation and default values.\n\t\t\t\t@TABLE\t\tDB table name being processed.\n\t\t\t\t@CTR\t\tControls for NOT NULL fields.\n\t\t\t\t@INITIALIZE\tDefault values for each fields.\n\t\t\t\t@SERIAL\t\tFunction to obtain auto-numeric ID form serial table.\n\t\t\t\t@CTRI\t\tIntegrity checks.\n\t\t-a= or --author= *\n\t\t-l= or --url= *\n\t\t-k= or --package= *\n\n\t\t\t*Can't contain special chars(\\ or \") or the should be escaped like \\\\\ and \\\".\n\n\tConnection Values:\n\t\t-u= or --user= \n\t\t-p= or --passwd= \n\t\t-d= or --database= \n\n\tOptional Connection values:\n\t\t-h= or --host= \n\t\t-P= or --port= " 1 message "\t\t\-x= or --export= \tExports default Motte class template to specified file. If none is specified will be exported to \"mteTpl.mte\"." 1 message "Syntax:\t$0 [-v] [-i] -u= -p= -d= [-h=] [-P=] [-o=] [-t=] [-a=] [-l=] [-k=] [--ver=]\nor\n\t$0 -x[=]" 1 message "Usage:\t$0 -v -u=myuser -p=mypass -d=testdb\n\t\tor\n\t$0 -x" 1 if [ "$1" != "" ]; then exit 1 else exit 0 fi else message "$1" 1 exit 1 fi } # message [1|2] # show runtime messages if verbose option was set (-v or --verbose) # 1- leaves an empty line after the text # 2- leaves an empty line before and after the text # function message { if [ "$VERBOSE" == "1" ]; then if [ "$2" == "2" ]; then echo ""; fi echo -e "$1" if [ "$2" == "2" ] || [ "$2" == "1" ]; then echo ""; fi fi } # eraseTmp [] # erase temporary files with name starting with argument received and ending with .mte.tmp # if no argument is received, will erase all temporary files. # function eraseTmp { if [ -d ./mte_Tmp_dir ] && [ "$1" == "" ]; then rm -rf ./mte_Tmp_dir fi if [ "$1" != "" ]; then FILE_PATTERN="_$1_*.mte.tmp" if [ $(ls ./mte_Tmp_dir/${FILE_PATTERN} | wc -w) -gt 0 ]; then rm ./mte_Tmp_dir/$FILE_PATTERN fi fi } # # # # function createTplFile { # ToDo Perro... # >> ./mte_Tmp_dir/mteTpl.mte # echo not implemented yet... cp ./mteTpl.mte ./mte_Tmp_dir } # # ============================================================================================== # # A R G U M E N T S C H E C K # # ============================================================================================== # # Check for at least 3 args received # if [ "$#" -lt "3" ] && [ "$#" != "1" ]; then finish help "Too few arguments($# of 3)..." fi if [ "$#" != "1" ]; then while [ $# -gt 0 ]; do value=$1 PAR=${value%=*} PARVALUE=${value#*=} case "$PAR" in -v | --verbose) VERBOSE=1 ;; -i | --autoincremental) INCREMENTAL=1 ;; -u | --user) DBUSER="-u $PARVALUE" ;; -p | --passwd) DBPASS="--password=$PARVALUE" ;; -d | --database) DBNAME=$PARVALUE ;; -h | --host) DBHOST="-h $PARVALUE" ;; -P | --port) DBHOSTPORT="-P$PARVALUE" ;; -o | --output) CLSPATH=$PARVALUE ;; -h | --help) finish "help" ;; -t | --template) TPLFILE="$PARVALUE" ;; -k | --package) PACKAGE="$PARVALUE" ;; -a | --author) AUTHOR="$PARVALUE" ;; -r | --url) URL="$PARVALUE" ;; -l | --license) LICENSE="$PARVALUE" ;; --ver) VERSION="1.0" ;; *) finish help "You have specified an invalid argument!" esac shift done else value=$1 PAR=${value%=*} PARVALUE=${value#*=} if [ "$PAR" != "-x" ] && [ "$PAR" != "--export" ]; then finish help "You have specified an invalid argument!" fi if [ "$PARVALUE" == "" ] || [ "$PARVALUE" == "-x" ]; then TPLFILE="./mteTpl.mte" else TPLFILE="$PARVALUE" fi eraseTmp mkdir ./mte_Tmp_dir if [ "$?" -gt "0" ]; then finish help "You don't have writing privileges on this folder... Unable to continue!" fi createTplFile cp ./mte_Tmp_dir/mteTpl.mte $TPLFILE finish "Motte Class Template succesfully created: $TPLFILE" fi if [ "$DBUSER" == "" ] || [ "$DBNAME" == "" ]; then finish help "Missing DB connection info(User/Database). Unable to continue!" fi if [ "$DBPASS" == "" ]; then DBPASS="-p" fi if [ "$CLSPATH" != "." ]; then if [ ! -d "$CLSPATH" ]; then finish help "Specified output directory don't exist! ($CLSPATH)" fi fi # # Testing temporary directory and directory privileges # eraseTmp mkdir ./mte_Tmp_dir if [ "$?" -gt "0" ]; then finish help "You don't have writing privileges on this folder... Unable to continue!" fi # Verify if template file exists. # if [ "$TPLFILE" == "" ]; then message "No template file specified, usig Motte default class schema..." 1 createTplFile TPLFILE="./mte_Tmp_dir/mteTpl.mte" fi if [ ! -f $TPLFILE ]; then finish help "Missing template file. The file you specified cannot be found($TPLFILE). Unable to continue!" fi # # ============================================================================================== # # S T A R T S D A T A B A S E P A R S I N G # # ============================================================================================== # # Create temporary file with database tables mysql -N $DBUSER $DBPASS $DBHOST $DBHOSTPORT $DBNAME --execute="SHOW TABLES">./mte_Tmp_dir/_tmp_tables.mte.tmp if [ "$?" -gt "0" ]; then finish "Errors trying to connect with server\nUsing: $DBUSER $DBPASS $DBHOST $DBHOSTPORT $DBNAME" fi # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # GENERATES TMP FILE FOR STRUCTURE - MUST BE DONE BEFORE PROCESSING TABLE CONTENTS # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - message "Creating temporary files..." for TABLE in $(cat ./mte_Tmp_dir/_tmp_tables.mte.tmp); do # Create temporary files for Motte(php) code for eache class touch ./mte_Tmp_dir/_${TABLE}_INI.mte.tmp touch ./mte_Tmp_dir/_${TABLE}_INI_COM.mte.tmp touch ./mte_Tmp_dir/_${TABLE}_INCLUDE.mte.tmp touch ./mte_Tmp_dir/_${TABLE}_CTR.mte.tmp touch ./mte_Tmp_dir/_${TABLE}_CTRI.mte.tmp touch ./mte_Tmp_dir/_${TABLE}_SERIAL.mte.tmp touch ./mte_Tmp_dir/_${TABLE}_TBLSTRUCT.mte.tmp done # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # GENERATES CLASS CONTENT BASED ON TABLE STRUCTURE # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - message "Obtaining table structure from server..." for TABLE in $(cat ./mte_Tmp_dir/_tmp_tables.mte.tmp); do if [ -f ${CLSPATH}/${TABLE}.model.php ]; then CLASS_CUSTOMIZED=$(echo $(grep @Customized ${CLSPATH}/${TABLE}.model.php | cut -f3 -d' ')) else CLASS_CUSTOMIZED="false" fi if [ "$CLASS_CUSTOMIZED" == "false" ]; then # create temporary files based on table structure message " Reading table structure for (${TABLE}) from server..." mysql -N $DBUSER $DBPASS $DBHOST $DBHOSTPORT $DBNAME --execute="DESCRIBE ${TABLE}" | sed s/"\t"/":"/g > ./mte_Tmp_dir/_tmp_fields.mte.tmp if [ "$?" -gt "0" ]; then finish "Error when trying to connect to DB\nUsing: $DBUSER $DBPASS $DBHOST $DBHOSTPORT $DBNAME" fi message " Processing fields from table: ${TABLE}" TBLSTRUCT="\n*\tTable Structure: ${TABLE}\n*\n"; for LINE in $(cat ./mte_Tmp_dir/_tmp_fields.mte.tmp); do # Get field name FIELD=$(echo "${LINE}"|cut -d: -f1) # Get field type TIPO=$(echo "${LINE}"|cut -d: -f2|cut -d'(' -f1) # Set 1 if field is table Primary key (Should be named as table with "_id" sufix) FIELD_KEY=0 if [ "${FIELD}" == "${TABLE}_id" ]; then FIELD_KEY=1 fi # Set 1 if field is required (NOT NULL/YES) FIELD_CTR=0 if [ "$(echo ${LINE}|cut -d: -f3)" != "YES" ]; then FIELD_CTR=1 fi # Getting default value from table structure FIELD_DEFAULT=$(echo "${LINE}"|cut -d: -f5) # Set 1 if Field is a foreign key (Foreing keys should be named as referenced table name and "_id" sufix) FIELD_FK=0 FIELD_FK_ID=$(echo ${FIELD}|cut -d_ --fields=1-$(expr $(echo ${FIELD}|sed "s/_/\n/g"|wc -l) - 1)) FIELD_FK_TABLE=$(echo ${FIELD_FK_ID}|cut -d_ --fields=1-$(expr $(echo ${FIELD_FK_ID}|sed "s/_/\n/g"|wc -l) - 1)) if [ "$(echo ${FIELD}|grep _id|wc -w)" == "1" ] && [ "${FIELD_FK_TABLE}" != "${TABLE}" ]; then FIELD_FK=1 fi # Generating Motte(php) code based on field type and expected behavior if [ "${FIELD_KEY}" == "1" ]; then if [ "$INCREMENTAL" != "1" ]; then # Auto_incremental / Uses a "serial" table for autonumeric values on InnoDB echo "include_once(MTE_MODEL.'\/serial.model.php');\n">>./mte_Tmp_dir/_${TABLE}_INCLUDE.mte.tmp echo "\n\t\t\/\/ Load autoincremental value\n\t\tif (\$this->countErrorExec() == 0){\n\t\t\t\/\/ Ask for autoincremental value\n\t\t\t\$tblSerial = new tbl_serial(\$this->getEngine());\n\t\t\t\$record['${FIELD}'] = \$tblSerial->getNextValue('${FIELD}');\n\t\t}\n">>./mte_Tmp_dir/_${TABLE}_SERIAL.mte.tmp fi else if [ "${FIELD_FK}" == "1" ]; then # Add include_once based on foreign fields echo "include_once(MTE_MODEL.'\/$(echo ${FIELD}|cut -d_ -f1).model.php');\t\/\/ Foreign field\n">>./mte_Tmp_dir/_${TABLE}_INCLUDE.mte.tmp # Initialize foreign fields with corresponding table default value echo "\n\t\t\/\/ Initialize foreign fields ${FIELD}\n\t\t\$tbl${FIELD_FK_TABLE} = new tbl_${FIELD_FK_TABLE}(\$this->getEngine());\n\t\t\$record['${FIELD}'] = \$tbl$tbl${FIELD_FK_TABLE}->getDafaultId();\n\n">>./mte_Tmp_dir/_${TABLE}_INI.mte.tmp # Record check for needed values (NOT NULL Fields) echo "\n\t\t\/\/ ${FIELD}\n\t\t\$tbl${FIELD_FK_TABLE} = new tbl_${FIELD_FK_TABLE}(\$this->getEngine());\n\t\tif (!\$tbl${FIELD_FK_TABLE}->exists(\"${FIELD_FK_ID}_id='\".\$record['${FIELD}'].\"'\"))\n\t\t\t\$this->addErrorExec(\__('No data could be found for field').' ${FIELD} ');\n">>./mte_Tmp_dir/_${TABLE}_CTR.mte.tmp # Integrity check control for record deletion based on foreign key on other tables echo "\n\t\t\/\/ Integrity for ${TABLE}\n\t\t\$tbl${TABLE} = new tbl_${TABLE}(\$this->getEngine());\n\t\t if (\$tbl${TABLE}->exists(\"${FIELD}='\".\$record['${FIELD}'].\"'\"))\n\t\t\t\$this->addErrorExec(\$tbl${TABLE}->getTableComment());\n">>./mte_Tmp_dir/_${FIELD_FK_TABLE}_CTRI.mte.tmp # Add include_once for tables used at Integrity check on record deletion. echo "include_once(MTE_MODEL.'\/${TABLE}.model.php');\t\/\/ Integrity Check\n">>./mte_Tmp_dir/_${FIELD_FK_TABLE}_INCLUDE.mte.tmp else # Inicializing class attributes with default values if [ "${FIELD_DEFAULT}" != "" ] && [ "${FIELD_DEFAULT}" != "NULL" ]; then VALUE="\"$(echo ${FIELD_DEFAULT} | sed "s/\\//\\\\\//g" )\""; else case "$(echo ${TIPO} | tr 'A-Z' 'a-z' )" in numeric | bit | int | decimal | tinyint | smallint | mediumint | integer | bigint | real | double | float | decimal) VALUE='0' ;; varchar | char | text | tinytext | mediumtext | longtext) VALUE='\"\"' ;; datetime | timestamp) VALUE="date('Y-m-d H:i:s')" ;; date) VALUE="date('Y-m-d')" ;; time) VALUE="date('H:i:s')" ;; year) VALUE="date('Y')" ;; esac fi echo "${FIELD}=${VALUE}">>./mte_Tmp_dir/_${TABLE}_INI_COM.mte.tmp # Control de datos VALUE='' if [ "${FIELD_CTR}" == "1" ]; then COMMON_FIELD="\n\t\t\/\/ ${FIELD}\n\t\tif (" COMMON_FIELD2="\$record['${FIELD}']" COMMON_FIELD3=" == '')\n\t\t\t\$this->addErrorExec(\__('Field').' " # based on field type case "$(echo ${TIPO} | tr 'A-Z' 'a-z' )" in int) VALUE="$COMMON_FIELD !is_int($COMMON_FIELD2) ${COMMON_FIELD3} ${FIELD} '.\__('must receive an integer value.'));" ;; decimal) VALUE="$COMMON_FIELD !is_float($COMMON_FIELD2) ${COMMON_FIELD3} ${FIELD} '.\__('must receive a numeric value.'));" ;; varchar | char) VALUE="$COMMON_FIELD $COMMON_FIELD2 $COMMON_FIELD3 ${FIELD} '.\__('cannot be empty.'));" ;; esac echo "${VALUE}">>./mte_Tmp_dir/_${TABLE}_CTR.mte.tmp fi fi fi message " Field ${LINE}..." done # Var assignment alingment if [ "$(cat ./mte_Tmp_dir/_${TABLE}_INI_COM.mte.tmp | wc -l)" -gt "0" ]; then echo "\n\t\t\/\/ Initialize others fields\n">>./mte_Tmp_dir/_${TABLE}_INI.mte.tmp # Max length MAX_LENGTH=0 for LINE in $(cat ./mte_Tmp_dir/_${TABLE}_INI_COM.mte.tmp); do LINE_LENGTH=$(echo ${LINE} | cut -d= -f1 | wc -m) if [ ${LINE_LENGTH} -gt ${MAX_LENGTH} ]; then MAX_LENGTH=${LINE_LENGTH} fi done MAX_LENGTH=$(expr ${MAX_LENGTH} + 1) for LINE in $(cat ./mte_Tmp_dir/_${TABLE}_INI_COM.mte.tmp); do LINE_LENGTH=$(echo ${LINE} | cut -d= -f1 | wc -m) BEFORE="\t\t\$record['$(echo ${LINE} | cut -d= -f1)']" AFTER="$(echo ${LINE} | cut -d= -f2);\n" SPACES=$(echo '################################' | cut -c 1-$(expr ${MAX_LENGTH} - ${LINE_LENGTH})) echo "${BEFORE}${SPACES}= ${AFTER}"|sed s/'#'/'\\ '/g>>./mte_Tmp_dir/_${TABLE}_INI.mte.tmp done fi # Add comment line for Class MAX_LENGTH='0:0:0:0:0:0' echo "field:type:null:key:default:extra">./mte_Tmp_dir/_tmp_fieldsc.mte.tmp cat ./mte_Tmp_dir/_tmp_fields.mte.tmp>>./mte_Tmp_dir/_tmp_fieldsc.mte.tmp for LINE in $(cat ./mte_Tmp_dir/_tmp_fieldsc.mte.tmp); do COUNTER=1 LENAUX='' while [ $COUNTER -lt 7 ]; do # Maximo actual MAX_LENGTH_AUX=$(echo ${MAX_LENGTH} | cut -d: -f${COUNTER}) declare -i MAX_LENGTH_AUX LINE_LENGTH=$(echo ${LINE} | cut -d: -f${COUNTER} | wc -m) LINE_LENGTH=$(expr ${LINE_LENGTH} + 1) if [ ${LINE_LENGTH} -gt ${MAX_LENGTH_AUX} ]; then LENAUX=${LENAUX}${LINE_LENGTH}':' else LENAUX=${LENAUX}${MAX_LENGTH_AUX}':' fi COUNTER=$(expr ${COUNTER} + 1) done MAX_LENGTH=${LENAUX} done echo "\n*\tTable structure: ${TABLE}\n*\n">>./mte_Tmp_dir/_${TABLE}_TBLSTRUCT.mte.tmp HEADER='' COUNTER=1 while [ $COUNTER -lt 7 ]; do MAX_LENGTH_AUX=$(echo ${MAX_LENGTH} | cut -d: -f${COUNTER}) SPACES=$(echo '----------------------------------------------------------------------------' | cut -c 1-${MAX_LENGTH_AUX}) HEADER="${HEADER}${SPACES}+" COUNTER=$(expr ${COUNTER} + 1) done echo "*\t+${HEADER}\n">>./mte_Tmp_dir/_${TABLE}_TBLSTRUCT.mte.tmp LINE_NBR=1 for LINE in $(cat ./mte_Tmp_dir/_tmp_fieldsc.mte.tmp); do COUNTER=1 AUX='#' while [ $COUNTER -lt 7 ]; do LINE_LENGTH=$(echo ${LINE} | cut -d: -f${COUNTER} | wc -m) MAX_LENGTH_AUX=$(echo ${MAX_LENGTH} | cut -d: -f${COUNTER}) BEFORE=$(echo ${LINE} | cut -d: -f${COUNTER}) SPACES=$(echo '#################################################' | cut -c 1-$(expr ${MAX_LENGTH_AUX} - ${LINE_LENGTH})) AUX=${AUX}${BEFORE}${SPACES}"|#" COUNTER=$(expr ${COUNTER} + 1) done echo "*\t|${AUX}\n" | sed s/'#'/'\\ '/g | sed -r s/'\/'/'\\\/'/g >>./mte_Tmp_dir/_${TABLE}_TBLSTRUCT.mte.tmp if [ "${LINE_NBR}" == "1" ]; then echo "*\t+${HEADER}\n">>./mte_Tmp_dir/_${TABLE}_TBLSTRUCT.mte.tmp fi LINE_NBR=$(expr ${LINE_NBR} + 1) done echo "*\t+${HEADER}">>./mte_Tmp_dir/_${TABLE}_TBLSTRUCT.mte.tmp else message " Ignoring table (${TABLE}) because \"CUSTOMIZED\" tag is set to TRUE..." fi done # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # GENERATES MOTTE(php) CLASS AND REPLACE TEMPLATE VARIABLES WITH GENERATED CONTENT # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - message "DB Structure scan completed. Generating Motte Classes..." 2 for TABLE in $(cat ./mte_Tmp_dir/_tmp_tables.mte.tmp); do if [ -f ${CLSPATH}/${TABLE}.model.php ]; then CLASS_CUSTOMIZED=$(echo $(grep @Customized ${CLSPATH}/${TABLE}.model.php | cut -f3 -d' ')) else CLASS_CUSTOMIZED="false" fi if [ "$CLASS_CUSTOMIZED" == "false" ]; then message " Motte Class: ${TABLE}.model.php" INI=$(cat ./mte_Tmp_dir/_${TABLE}_INI.mte.tmp) CTR=$(cat ./mte_Tmp_dir/_${TABLE}_CTR.mte.tmp) INCLUDE=$(cat ./mte_Tmp_dir/_${TABLE}_INCLUDE.mte.tmp | uniq) SERIAL=$(cat ./mte_Tmp_dir/_${TABLE}_SERIAL.mte.tmp) CTRI=$(cat ./mte_Tmp_dir/_${TABLE}_CTRI.mte.tmp) TBLSTRUCT=$(cat ./mte_Tmp_dir/_${TABLE}_TBLSTRUCT.mte.tmp) if [ "$TABLE" == "serial" ]; then FUNCSERIAL=$(echo -e "\\\tpublic function getNextValue(\$key){\\\n\\\t\\\t\\\t\$where = new mteWhereSql();\\\n\\\t\\\t\$where->addAND('serial_id','=',\"'\$key'\");\\\n\\\t\\\tif (!\$this->exists(\$where-\>fetch())){\\\n\\\t\\\t\\\tprint(\"Non existent key '\$key' on database.\");\\\n\\\t\\\t\\\texit();\\\n\\\t\\\t}\\\n\\\n\\\t\\\t\$record = \$this->getRecord(\$where->fetch());\\\n\\\t\\\t\$record['codigo'] = \$record['codigo']+1;\\\n\\\n\\\t\\\t\$this->updateRecord(\$record);\\\n\\\n\\\t\\\treturn \$record['codigo'];\\\n\\\t}\\\n") else FUNCSERIAL="" fi sed -e "s/@DATE/$(date)/g" \ -e "s/@TABLE/$(echo ${TABLE})/g" \ -e "s/@INICIALIZE/$(echo ${INI})/g" \ -e "s/@SERIAL/$(echo ${SERIAL})/g" \ -e "s/@CTRI/$(echo ${CTRI})/g" \ -e "s/@CTR/$(echo ${CTR})/g" \ -e "s/@INCLUDES/$(echo ${INCLUDE})/g" \ -e "s/@TBLSTRUCT/$(echo $TBLSTRUCT)/g" \ -e "s/@AUTHOR/$(echo ${AUTHOR})/g" \ -e "s/@APPURL/$(echo ${URL})/g" \ -e "s/@PACKAGE/$(echo ${PACKAGE})/g" \ -e "s/@LICENSE/$(echo ${LICENSE})/g" \ -e "s/@VERSION/$(echo ${VERSION})/g" \ -e "s/@FUNCSERIAL/$(echo ${FUNCSERIAL})/g" \ $TPLFILE > ./mte_Tmp_dir/${TABLE}.model.tmp cat ./mte_Tmp_dir/${TABLE}.model.tmp |sed -r s/^[' ']//g> $CLSPATH/${TABLE}.model.php else message " Ignoring table (${TABLE}) because \"CUSTOMIZED\" tag is set to TRUE..." fi done message "Erasing temporary files..." # Erasing tmp files eraseTmp message "Task finished." 1 exit 0