#!/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 只有新版的才可以有空格
#-------------------------------------------------------------------------------