Sau vài ngày research, tôi vẫn không thể tìm ra phương pháp tốt nhất để phân tích cú pháp cmdline args trong tập lệnh .sh. Theo tài liệu tham khảo của tôi getopts cmd là con đường để đi vì nó "chiết xuất và kiểm tra công tắc mà không làm phiền các tham số vị trí variables.Unexpected bị chuyển mạch, hoặc công tắc đang thiếu lập luận, được công nhận và reportedas lỗi."Cách tốt nhất để phân tích cú pháp dòng lệnh args trong Bash là gì?
Positional params (Ví dụ 2 - $ @, $ #, vv) dường như không hoạt động tốt khi không gian được tham gia nhưng có thể nhận ra các tham số thường xuyên và dài (-p và --longparam). Tôi nhận thấy rằng cả hai phương thức đều thất bại khi truyền các tham số với các dấu ngoặc lồng nhau ("đây là một Ex. Of" "dấu ngoặc kép" "."). Một trong ba mẫu mã nào tốt nhất minh họa cách xử lý cmdline args? Chức năng getopt không được khuyến khích bởi rất kinh nghiệm, vì vậy tôi đang cố gắng tránh nó!
Ví dụ 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
Ví dụ 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*
Ví dụ 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
bản sao có thể có của [Làm cách nào để phân tích đối số dòng lệnh trong bash?] (Http://stackoverflow.com/questions/192249/how-do-i-parse-command-line-arguments-in-bash) –