Linux

具有多個標誌的腳本

  • March 22, 2019

我正在嘗試創建一個小寫/大寫文件或目錄的腳本。

modify [-r] [-l|-u] <dir/file names...>

我目前正在使用 getopts 來檢查標誌。但是,我不能像修改 -rl 那樣執行我的命令,以遞歸方式將我的 dir / files 小寫。

(編輯)程式碼:

#!/bin/bash

FLAGS=""
if [ $# -eq 0 ]
then
   echo -e "No arguments supplied. \nPlease supply an argument.For more information use -h."
else
 while getopts "rluh" opt
 do
   case $opt in
     r)
       FLAGS+=r
       ;;
     l)
       FLAGS+=l
       ;;
     u)
       FLAGS+=u
       ;;
     h)
       FLAGS+=h
       ;;
     *)
       echo "Unrecognized argument. Please enter -h for information"
   esac
 done

fi
if [[ "$FLAGS" == "l" && "$2" -eq 0 ]]
then
 echo "file to modify $2"
elif [[ "$FLAGS" == "h" && "$2" -eq 0 ]] 
then
 echo "Some info"
fi


exit 0

如果您為每個啟動的選項設置單獨的標誌,則更容易,這樣您就無需解析另一個字元串來檢查是否使用了選項。

例如:

#!/bin/bash

self=$0

show_help () {
   cat <<END_HELP
Usage: $self [-r] [-l|-u] pathname [...]

Options:

   info about options here

END_HELP
}

recurse=0    # don't recurse by default
lowercase=1  # lowercase by default

while getopts rluh opt; do
   case $opt in
       r) recurse=1   ;;
       l) lowercase=1 ;;
       u) lowercase=0 ;;
       h) show_help
          exit ;;
       *) echo 'Error in parsing options' >&2
          exit 1
   esac
done

shift "$(( OPTIND - 1 ))"

for pathname do
   if [ -d "$pathname" ] && [ "$recurse" -eq 1 ]; then
       # recurse here
   fi
   if [ "$lowercase" -eq 1 ]; then
       # turn into lowercase
   else
       # turn into uppercase
   fi
done

請注意,後面的程式碼shift只是範常式式碼。我建議您不要考慮使用循環find進行遞歸(可能在所有情況下,即使recursion設置標誌)。

順便說一句,它shift擺脫了所有已解析的選項,"$@"因此僅路徑名操作數留在位置參數列表中。這就是之後循環迭代的內容。

上面寫的程式碼使用合理的預設值(這些應該在幫助文本中提到)。這意味著在沒有任何選項的情況下執行腳本是完全可以的。附帶說明一下,在沒有任何參數的情況下執行該工具可能不會導致錯誤。沒有工作要做,所以不應該做任何工作。

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