Shell脚本强制参数校验异常:-d/-v必填、-h可选但校验失效
store.sh Script Ah, I see the issue here! getopts is great for parsing command-line options, but it doesn't automatically enforce that certain flags are mandatory. Your current script just processes whatever options are passed, but doesn't check if the required -d and -v were actually provided. Let's fix that.
First, let's start by defining a clear usage function that tells users exactly how to run the script—this will help both you and anyone using the script know what's required. Then, after parsing options with getopts, we'll add explicit checks to make sure both mandatory parameters are set.
Here's the revised script with proper validation:
#!/bin/bash # Define a usage function to show help and exit with a status code usage() { echo "Usage: $0 -d <directory> -v <version>" echo "Mandatory parameters:" echo " -d <directory> Target directory to work with" echo " -v <version> Version string (e.g., 1.0.0)" echo "Optional parameter:" echo " -h Show this help message" exit "$1" } # Initialize mandatory variables to empty strings DIRECTORY="" VERSION="" # Parse command-line options while getopts "hd:v:" arg; do case "$arg" in h) # Show help and exit successfully usage 0 ;; d) # Assign the directory parameter value DIRECTORY="$optarg" ;; v) # Assign the version parameter value VERSION="$optarg" ;; *) # Invalid option: show help and exit with error usage 1 ;; esac done # Critical: Validate that both mandatory parameters were provided if [ -z "$DIRECTORY" ] || [ -z "$VERSION" ]; then echo "Error: Both -d (directory) and -v (version) are required!" >&2 usage 1 fi # -------------------------- # Rest of your script logic goes here # -------------------------- echo "Success! Directory: $DIRECTORY, Version: $VERSION"
Key improvements explained:
- Explicit variable initialization: We start with
DIRECTORY=""andVERSION=""so we can reliably check if they were set by the user (using-zto test for empty strings). - Post-parsing validation: After
getoptsfinishes processing all options, we check if either mandatory variable is still empty. If so, we print an error message (to standard error,>&2—a best practice for shell scripts) and show the usage guide before exiting with an error code. - Clear usage function: The
usagefunction makes it obvious which parameters are mandatory vs optional, and accepts an exit code parameter (0 for successful help display, 1 for error cases).
This way, if someone runs ./store.sh -d /path/to/dir (without -v), or ./store.sh -v 1.0 (without -d), or even just ./store.sh, the script will immediately catch the missing parameters and tell the user what they did wrong.
内容的提问来源于stack exchange,提问作者sachin sarangamath

