簡體   English   中英

Bash腳本中的RegEx(for-loop)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM