shell程式設計 getopt設計例項

2021-09-20 01:33:26 字數 2213 閱讀 2108

這裡提供乙個和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...