Linux
具有多個標誌的腳本
我正在嘗試創建一個小寫/大寫文件或目錄的腳本。
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
擺脫了所有已解析的選項,"$@"
因此僅路徑名操作數留在位置參數列表中。這就是之後循環迭代的內容。上面寫的程式碼使用合理的預設值(這些應該在幫助文本中提到)。這意味著在沒有任何選項的情況下執行腳本是完全可以的。附帶說明一下,在沒有任何參數的情況下執行該工具可能不會導致錯誤。沒有工作要做,所以不應該做任何工作。