Bash

如何使用 getopts 正確解析 shell 腳本標誌和參數

  • January 6, 2019

我正在使用這個:

例如./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 -fNOK:以 - 開頭的字元串怎麼沒有被檢測為標誌?

您已經告訴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

命令行選項不能同時接受和不接受參數。

引用自:https://unix.stackexchange.com/questions/440206