Linux-Bash Shell-獲取命令行參數


#!/bin/bash

################################################################################
# Author   : Jet Bi
# License  : www.cyeap.com    
# Summary  : Bash Shell獲取命令行參數的示例
# Notes    : -
################################################################################

#-------------------------------------------------------------------------------
# 方式一: 直接利用$n(n為1-9)的方式按位置進行獲取
#-------------------------------------------------------------------------------
echo "第一個參數:"$1
echo "第二個參數:"$2
echo "第三個參數:"$3

#-------------------------------------------------------------------------------
# 方式二: 使用內置命令getopts獲取命名參數
#     語法:
#         getopts optstring varname
#     解析:
#         1.optstring是一個符合規則的字符串,如: 'a:b:cd'
#           這表示可以傳4個選項 -a -b -c -d 其中-a, -b選項的:表示是選項后面要有參數的
#         2.varname表示讀取到的選項
#         3.特殊變量${OPTARG}能夠獲取選項后面跟的參數
#         4.特殊變量${OPTIND}反映下一個要處理的參數索引,初始值是1
#     注:
#         1.getopts不支持長選項參數
#         2.對於有參數的選項必須要用空格分隔,如-a arg
#         3.對於沒有參數的選項是可以連起來的,如 -bc 等同於 -b -c
#-------------------------------------------------------------------------------
while getopts 'a:bcd:' OPT; do
    case ${OPT} in
      a)
        echo "選項-a已經生效"
        echo "選項-a是可以帶參數的,參數值為:"${OPTARG}
        ;;
      b)
        echo "選項-b已經生效"
        echo "選項-b是不需要參數的"
        ;;
      c)
        echo "選項-c已經生效"
        echo "選項-c是不需要參數的"
        ;;
      d)
        echo "選項-d已經生效"
        echo "選項-d是可以帶參數的,參數值為:"${OPTARG}
        ;;
      *)
        echo "無效的參數"
        ;;
    esac
done

#-------------------------------------------------------------------------------
# 方式三: 使用外部命令getopt獲取命名參數
#     語法
#         getopt [OPTION...] -o 短選項optstring -l 長選項optstring -- parameters
#     解析
#         1.getopt命令的選項說明
#             -a  表示是否支持長選項的簡單模式(即以一個 - 接長選項),必須與-l同時用
#             -o  后面接getopt支持短選項列表 
#             -l  后面接getopt支持長選項列表
#         2.optstring是一個符合規則的字符串,如: 'a:,b:,cd::'(短選項)'apple:,banana:,cherry::'(長選項)
#             一個:代表必選參數
#             兩個::代表可選參數  
#         3.每解析一個選項,有參數的shift 2 ,沒有參數的 shift   
#-------------------------------------------------------------------------------

# 1.使用getopt獲取一個解析后的字符串
parse_options=$(getopt -o a,b:,c::,d -l apple,banana:,cherry:: -- $@)

# 2.將傳遞的參數設置成剛解析的字符串,--代表傳遞的參數,eval是為了防止有shell關鍵字和可選參數的的空格識別
eval set -- $parse_options

# 3.遍歷參數
while true; do
    case "$1" in
      -a | --apple)
          echo "I have an apple!"
          shift
          ;;
      -b | --banana)
          echo "I have a banana,banana is $2"
          shift 2
          ;;
      -c | --cherry)
          case $2 in
            '')
                echo "I have a cherry!"
                shift 2
                ;;
            *)
                echo "I have a cherry!It is $2"
                shift 2
                ;;
          esac
          ;;
      -d)
          echo "I have a dog!"
          shift
          ;;
      --)
          shift
          break
          ;;
      *)
          echo "Parse Error!"
          exit 1
          ;;
    esac
done
#-------------------------------------------------------------------------------
#getopts和getopt的區別
#
#1.getopts 是Shell內建命令
#  getopt  是一個獨立外部工具
#2.getopts 使用語法簡單
#  getopt  使用語法復雜
#3.getopts 不支持長選項 
#  getopt  支持長選項
#4.getopts 不會重排所有參數的順序
#  getopt  會重排參數順序 
#5.getopts 的Shell內置 OPTARG 這個變量,getopts 通過修改這個變量依次獲取參數
#  getopt  必須使用 set 來重新設定位置參數,然后在 getopt 中使用 shift 來依次獲取參數
#6.getopts 可以接受參數有空格
#  getopt  只有新版的才可以有空格
#-------------------------------------------------------------------------------


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM