在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