简体   繁体   English

如何在命令行中为此Shell脚本输入参数?

[英]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. 我出于学习目的,在笔记本电脑上设置了VMWare ESXi。 I wanted to automate things and got this very nice shell script. 我想使事情自动化,并得到了这个非常好的shell脚本。 It asks for parameters such as the cpu cores, iso path, ram and disk space. 它要求提供诸如cpu内核,iso路径,内存和磁盘空间之类的参数。 I am a beginner in the shell. 我是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. 我不明白如何输入<|c|i|r|s> -确切地说,所需的语法不清楚。

#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. 将它们输入为-k value对,其中k是用于标识参数的字母。

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. vmname名称设置为vmname ,将CPU数量设置为2,将ISO文件名设置为/path/to/file.iso等。

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. 幸运的是,使用shell脚本,您可以看到代码。 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. 请注意:编写Shell脚本时,请确保在用法消息或脚本内的注释中清楚记录了用法信息。 The shell script you show is an example of how not to do it. 您显示的shell脚本是如何不执行此操作的示例。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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