[英]RegEx in bash-script (for-loop)
我想通過使用for循環解析給shell腳本的參數。 現在,假設我有3個參數,像for i in $1 $2 $3
這樣的東西應該可以完成這項工作,但我無法預測參數的數量,所以我想使用RegEx作為范圍,$#作為最后一個參數的數量。 我不知道如何在for循環中使用這些RegEx',我for i in $[1-$#]
嘗試了類似於for i in $[1-$#]
東西for i in $[1-$#]
但這不起作用。 該循環僅運行1次,並且計算1 - $#,而不是用作RegEx。
如果未指定in
子句,則默認情況下, for
循環將循環執行命令行參數:
for arg; do
echo "$arg"
done
如果你想要明確,你可以把所有的參數都稱為"$@"
。 上面的循環相當於:
for arg in "$@"; do
echo "$arg"
done
從bash手冊頁:
特殊參數
$@
- 從一個開始擴展到位置參數。 當擴展發生在雙引號內時,每個參數都會擴展為單獨的單詞。 也就是說,"$@"
相當於"$1" "$2" ...
如果雙引號擴展發生在一個單詞中,則第一個參數的擴展與原始單詞的開頭部分連接,最后一個參數的擴展與原始單詞的最后一部分連接。 當沒有位置參數時,"$@"
和$@
擴展為空(即,它們被刪除)。
對於重載參數處理, getopt
+ shift
是要走的路。 getopt
將預處理命令行,為用戶提供一些指定參數的靈活性。 例如,它會將-xzf
擴展為-x -z -f
。 它在將標志與文件名分開的所有標志之后添加一個--
參數; 這讓你運行cat -- -my-file
顯示的內容-my-file
,而不barfing在領先沖刺。
試試這個樣板代碼的大小:
#!/bin/bash
eval set -- "$(getopt -o a:bch -l alpha:,bravo,charlie,help -n "$0" -- "$@")"
while [[ $1 != -- ]]; do
case "$1" in
-a|--alpha)
echo "--alpha $2"
shift 2
;;
-b|--bravo)
echo "--bravo"
shift
;;
-c|--charlie)
echo "--charlie"
shift
;;
-h|--help)
echo "Usage: $0 [-a ARG] [-b] [-c]" >&2
exit 1
;;
esac
done
shift
請注意,每個選項都有一個短的等長,例如-a
和--alpha
。 -a
標志接受一個參數,因此在getopt
調用中將其指定為a:
和alpha:
getopt
並在其大小寫結尾處有一個shift 2
。
迭代更接近你正在努力的論點的另一種方法是:
for ((i=1; i<=$#; i++))
do
echo "${@:i:1}"
done
但是John Kugelman所展示的for arg
語法是最好的。 但是,有時陣列切片很有用。 此外,在此版本中,與John的一樣,參數數組保持不變。 使用shift
會丟棄其元素。
您應該注意,您嘗試使用方括號的內容根本不是正則表達式。
我建議做其他事情:
while [ -n "$1" ] ; do
# Do something with $1
shift
# Now whatever was in $2 is now in $1
done
shift
關鍵字將$ 2的內容轉換為$ 1,將$ 3的內容轉換為$ 2等.pp。
讓我們說下面的論點:
a b c d
shift
,爭論現在是:
b c d
使用while循環,您可以解析任意數量的參數,甚至可以執行以下操作:
while [ -n "$1" ] ; do
if [ "$1" = "-f" ] ; then
shift
if [ -n "$1" ] ; then
myfile="$1"
else
echo "-f needs an additional argument"
end
fi
shift
done
想象一下,參數是一個數組,$ n是該數組的索引。 shift
刪除第一個元素,因此索引1現在引用shift
之前索引為2的元素。 我希望你明白我想說的話。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.