在research幾天後,我仍然無法找出在.sh腳本中解析cmdline參數的最佳方法。據我引用getopts的cmd是因爲它要走的路「提取和檢查交換機在不干擾位置參數variables.Unexpected開關,或缺少參數開關,識別和reportedas錯誤。」在Bash中解析命令行參數的最佳方法是什麼?
陣地params(例2 - $ @,$#等)在涉及空間時顯然不能很好地工作,但可以識別常規和長參數(-p和--longparam)。我注意到,在使用嵌套引號傳遞參數時,這兩種方法都會失敗(「這是」「」quotes「」。「)的Ex。這三個代碼示例中的哪一個最能說明如何處理cmdline參數? getopt函數不被大師推薦,所以我試圖避免它!
實施例1:
#!/bin/bash
for i in "[email protected]"
do
case $i in
-p=*|--prefix=*)
PREFIX=`echo $i | sed 's/[-a-zA-Z0-9]*=//'`
;;
-s=*|--searchpath=*)
SEARCHPATH=`echo $i | sed 's/[-a-zA-Z0-9]*=//'`
;;
-l=*|--lib=*)
DIR=`echo $i | sed 's/[-a-zA-Z0-9]*=//'`
;;
--default)
DEFAULT=YES
;;
*)
# unknown option
;;
esac
done
exit 0
實施例2:
#!/bin/bash
echo ‘number of arguments’
echo "\$#: $#"
echo 」
echo ‘using $num’
echo "\$0: $0"
if [ $# -ge 1 ];then echo "\$1: $1"; fi
if [ $# -ge 2 ];then echo "\$2: $2"; fi
if [ $# -ge 3 ];then echo "\$3: $3"; fi
if [ $# -ge 4 ];then echo "\$4: $4"; fi
if [ $# -ge 5 ];then echo "\$5: $5"; fi
echo 」
echo ‘using [email protected]’
let i=1
for x in [email protected]; do
echo "$i: $x"
let i=$i+1
done
echo 」
echo ‘using $*’
let i=1
for x in $*; do
echo "$i: $x"
let i=$i+1
done
echo 」
let i=1
echo ‘using shift’
while [ $# -gt 0 ]
do
echo "$i: $1"
let i=$i+1
shift
done
[/bash]
output:
bash> commandLineArguments.bash
number of arguments
$#: 0
using $num
$0: ./commandLineArguments.bash
using [email protected]
using $*
using shift
#bash> commandLineArguments.bash "abc def" g h i j*
實施例3:
#!/bin/bash
while getopts ":a:" opt; do
case $opt in
a)
echo "-a was triggered, Parameter: $OPTARG" >&2
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
:)
echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
esac
done
exit 0
可能的重複[如何在bash中解析命令行參數?](http://stackoverflow.com/questions/192249/how-do-i-parse-command-line-arguments-in-bash) – 2013-11-12 12:45:47