Bash
如何使用 getopts 正確解析 shell 腳本標誌和參數
我正在使用這個:
例如
./imgSorter.sh -d directory -f format
腳本的內容是:
#!/bin/bash while getopts ":d:f:" opt; do case $opt in d) echo "-d was triggered with $OPTARG" >&2 ;; f) echo "-f was triggered with $OPTARG" >&2 ;; \?) echo "Invalid option: -$OPTARG" >&2 exit 1 ;; :) echo "Option -$OPTARG requires an argument." >&2 exit 1 ;; esac done
案例 :
$ ./imgSorter.sh -d myDir -d was triggered with myDir
好的
$ ./imgSorter.sh -d -f myFormat -d was triggered with -f
NOK:以 - 開頭的字元串怎麼沒有被檢測為標誌?
您已經告訴
getopts
該-d
選項應該接受一個參數,並且在命令行中您-d -f myformat
清楚地使用(?)說“-f
是我給-d
選項的參數”。這不是程式碼中的錯誤,而是在命令行中使用腳本的錯誤。
您的程式碼需要驗證選項參數是否正確,並且所有選項都以適當的方式設置。
可能像
while getopts "d:f:" opt; do case $opt in d) dir=$OPTARG ;; f) format=$OPTARG ;; *) echo 'error' >&2 exit 1 esac done # If -d is *required* if [ ! -d "$dir" ]; then echo 'Option -d missing or designates non-directory' >&2 exit 1 fi # If -d is *optional* if [ -n "$dir" ] && [ ! -d "$dir" ]; then echo 'Option -d designates non-directory' >&2 exit 1 fi
如果該
-d
選項是可選的,並且如果您想在上面的程式碼中為變數使用預設值,那麼您首先要在循環之前設置該預設值。dir``dir``while
命令行選項不能同時接受和不接受參數。