简体   繁体   中英

How to enter the parameters on the command line for this shell script?

I was setting up VMWare ESXi on my laptop for learning purposes. I wanted to automate things and got this very nice shell script. It asks for parameters such as the cpu cores, iso path, ram and disk space. I am a beginner in the shell. I understand that it's a very basic question but couldn't find an answer on the internet. Here's the code.

I don't understand how to enter the values of <|c|i|r|s> — the syntax required is not clear, to be precise.

#paratmers: machine name (required), CPU (number of cores), RAM (memory size in MB), HDD Disk size (in GB), ISO (Location of ISO image, optional)
#default params: CPU: 2, RAM: 4096, DISKSIZE: 20GB, ISO: 'blank'
-
phelp() {
    echo "Script for automatic Virtual Machine creation for ESX"
    echo "Usage: ./create.sh options: n <|c|i|r|s>"
    echo "Where n: Name of VM (required), c: Number of virtual CPUs, i: location of an ISO image, r: RAM size in MB, s: Disk size in GB"
    echo "Default values are: CPU: 2, RAM: 4096MB, HDD-SIZE: 20GB"
}

CPU=2
RAM=4096
SIZE=20
ISO="ISO'S"
FLAG=true
ERR=false
n=vmoo 


while getopts n:c:i:r:s: option
 do
    case $option in
            n)
                NAME=${OPTARG};
                FLAG=false;
                if [ -z $NAME ]; then
                    ERR=true
                    MSG="$MSG | Please make sure to enter a VM name."
                fi
                ;;
            c)
                CPU=${OPTARG}
                if [ `echo "$CPU" | egrep "^-?[0-9]+$"` ]; then
                    if [ "$CPU" -le "0" ] || [ "$CPU" -ge "32" ]; then
                        ERR=true
                        MSG="$MSG | The number of cores has to be between 1 and 32."
                    fi
                else
                    ERR=true
                    MSG="$MSG | The CPU core number has to be an integer."
                fi
                ;;
            i)
                ISO=${OPTARG}
                if [ ! `echo "$ISO" | egrep "^.*\.(iso)$"` ]; then
                    ERR=true
                    MSG="$MSG | The extension should be .iso"
                fi
                ;;
            r)
                RAM=${OPTARG}
                if [ `echo "$RAM" | egrep "^-?[0-9]+$"` ]; then
                    if [ "$RAM" -le "0" ]; then
                        ERR=true
                        MSG="$MSG | Please assign more than 1MB memory to the VM."
                    fi
                else
                    ERR=true
                    MSG="$MSG | The RAM size has to be an integer."
                fi
                ;;
            s)
                SIZE=${OPTARG}
                if [ `echo "$SIZE" | egrep "^-?[0-9]+$"` ]; then
                    if [ "$SIZE" -le "0" ]; then
                        ERR=true
                        MSG="$MSG | Please assign more than 1GB for the HDD size."
                    fi
                else
                    ERR=true
                    MSG="$MSG | The HDD size has to be an integer."
                fi
                ;;
            \?) echo "Unknown option: -$OPTARG" >&2; phelp; exit 1;;
            :) echo "Missing option argument for -$OPTARG" >&2; phelp; exit 1;;
            *) echo "Unimplimented option: -$OPTARG" >&2; phelp; exit 1;;
    esac
done

if $FLAG; then
echo "You need to at least specify the name of the machine with the -n parameter."
exit 1
fi

if $ERR; then
echo $MSG
exit 1
fi

if [ -d "$NAME" ]; then
echo "Directory - ${NAME} already exists, can't recreate it."
exit
fi


mkdir ${NAME}


vmkfstools -c "${SIZE}"G -a lsilogic $NAME/$NAME.vmdk


touch $NAME/$NAME.vmx


cat << EOF > $NAME/$NAME.vmx

config.version = "8"
virtualHW.version = "7"
vmci0.present = "TRUE"
displayName = "${NAME}"
floppy0.present = "FALSE"
numvcpus = "${CPU}"
scsi0.present = "TRUE"
scsi0.sharedBus = "none"
scsi0.virtualDev = "lsilogic"
memsize = "${RAM}"
scsi0:0.present = "TRUE"
scsi0:0.fileName = "${NAME}.vmdk"
scsi0:0.deviceType = "scsi-hardDisk"
ide1:0.present = "TRUE"
ide1:0.fileName = "${ISO}"
ide1:0.deviceType = "cdrom-image"
pciBridge0.present = "TRUE"
pciBridge4.present = "TRUE"
pciBridge4.virtualDev = "pcieRootPort"
pciBridge4.functions = "8"
pciBridge5.present = "TRUE"
pciBridge5.virtualDev = "pcieRootPort"
pciBridge5.functions = "8"
pciBridge6.present = "TRUE"
pciBridge6.virtualDev = "pcieRootPort"
pciBridge6.functions = "8"
pciBridge7.present = "TRUE"
pciBridge7.virtualDev = "pcieRootPort"
pciBridge7.functions = "8"
ethernet0.pciSlotNumber = "32"
ethernet0.present = "TRUE"
ethernet0.virtualDev = "e1000"
ethernet0.networkName = "Inside"
ethernet0.generatedAddressOffset = "0"
guestOS = "other26xlinux-64"
EOF


MYVM=`vim-cmd solo/registervm /vmfs/volumes/datastore1/${NAME}/${NAME}.vmx`

vim-cmd vmsvc/power.on $MYVM

echo "The Virtual Machine is now setup & the VM has been started up. Your have the    following configuration:"
echo "Name: ${NAME}"
echo "CPU: ${CPU}"
echo "RAM: ${RAM}"
echo "HDD-size: ${SIZE}"
if [ -n "$ISO" ]; then
echo "ISO: ${ISO}"
else
echo "No ISO added."
fi
echo "Thank you."
exit

Enter them as -k value pairs, where k is the letter used to identify the parameter.

For instance:

./create.sh -n vmname -c 2 -i /path/to/file.iso -s 512

This sets the name to vmname , the number of CPUs to 2, the ISO filename to /path/to/file.iso , etc.

The usage message is about as unhelpful as you can get and still make an attempt at conveying information. Without the code, I would not have known what to do. Fortunately, with shell scripts, you can see the code, though. The usage message should read something more like:

{
echo "Usage: $0 -n 'vm name' [-c cpus][-i iso-image][-r ram][-s disk]"
echo "  -n 'vm name'  Name of VM (required)"
echo "  -c cpus       Number of virtual CPUs"
echo "  -i iso-image  Location of an ISO image"
echo "  -r ram        RAM size in MB"
echo "  -s disk       Disk size in GB"
echo "Default values are: CPU: 2, RAM: 4096MB, HDD-SIZE: 20GB"
} >&2

Take heed: when you write a shell script, ensure that the usage information is clearly documented, either in the usage message or perhaps in comments within the script. The shell script you show is an example of how not to do it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM