這裡提供乙個和seq命令功能相同的指令碼seq.sh,然後設計這個指令碼的選項。
先看一下seq命令的各個選項說明:
seq [option]... last # 語法1
seq [option]... first last # 語法2
seq [option]... first increment last # 語法3
選項:-s, --separator=string
使用指定的string分隔各數值,預設值為"\n"u
-w, --equal-width
使用0填充在字首使所有數值長度相同
--help
顯示幫助資訊並退出
--version
輸出版本資訊並退出
以下是指令碼內容:和seq相比,只有兩個問題:第乙個起點數值first不能為負數;不支援小數功能。其它功能完全相同
#!/usr/bin/env bash
usage
()# getopt的版本是增強版嗎
getopt -t &>/dev/null;[ $? -ne 4 ] &&
# 引數解析
parameters=`getopt -o +s:w --long separator:,equal-width,help,version -n "$0" -- "$@"`
[ $? -ne 0 ] &&
eval
set -- "$parameters"
while
true;do
case
"$1"
in -w|--equal-width) zero_pad="true"; shift ;;
-s|--separator) separator=$2; shift 2 ;;
--version) echo
"$0 version v1.0"; exit ;;
--help) usage;exit ;;
--)shift
first=$1
increment=$2
last=$3
break ;;
*) usage;exit 1;;
esac
done
# 用於生成序列數
function
seq_func
() -gt $ ] && echo
$ || echo
$` # 生成序列數
if [ "x$zero_pad" = "xtrue" ];then
# 填充0
if [ $step -gt 0 ];then
# 遞增,填充0
for((i=$first;i<=$last;i+=$step))i\n"
"$i";return; }
printf
"%0$i "
$i }
else
# 遞減,填充0
for((i=$first;i>=$last;i+=$step))i\n"
"$i";return; }
printf
"%0$i "
$i }
fielse
# 不填充0
if [ $step -gt 0 ];then
# 遞增,不填充0
for((i=$first;i<=$last;i+=$step))
printf
"%i "
$i }
else
# 遞減,不填充0
for((i=$first;i>=$last;i+=$step))
printf
"%i "
$i }
fifi}
# 指定輸出分隔符
: $# 輸出結果
seq_func $zero_pad
$separator
$first
$increment
$last | tr " "
"$separator"
上面解析選項的指令碼缺陷在於無法解析first為負數的情況,例如./seq.sh -w -5 3
將報錯。但可以寫為標準的./seq.sh -w -- -5 -3
語法。 使用getopt命令解析shell指令碼的命令列選項
在之前的一篇文章中,介紹了如何利用shell內建的getopts命令來幫助我們處理shell指令碼選項和引數,其缺點是只能處理短選項,無法處理長選項。下面,本文將要介紹的是getopt命令,它可以同時處理短選項和長選項。在getopt的較老版本中,存在一些bug,不大好用,在後來的版本中解決了這些問...
shell指令碼命令列引數獲取 getopts
引數說明 詳細說明 如果option string不用 開頭,invalid option錯誤和miss option argument錯誤都會使varname被設成?getopts包含兩個內建變數,optarg和optind bin bash quiet verbose device logfil...
SHELL指令碼學習總結(第二話)getopts命令
getopts命令 getopts命令內置於bash shell。getopts命令的格式如右 getopts optstring variable optstring定義的內容與getopt命令完全相同。但是其輸出內容與getopt命令完全不同。例子如下 getopt ab cd a b test...