簡體   English   中英

檢測參數數量和傳遞給bash的值

[英]Detect number of argument and the value passed into the bash

我想確保我的bash腳本可以正確檢測用戶的輸入參數。 具體來說,用戶只能將1或2或3傳遞給腳本,否則腳本將被終止。 我寫了以下代碼:

#!/bin/bash

for args in $@
do
    echo $args
done

if [ "$#" != 1 ] && [ "$#" -ne 1 ]; then
        echo "Illegal number of parameters"
        exit 1
fi

該腳本只能在用戶不輸入任何內容時捕獲,而不能檢查用戶是否確實輸入了數字1而不輸入其他值。

順便說一下,我不確定如何表達“輸入參數可以接受數字1或2或3”。

$#是整數,因此您必須使用整數比較。 例如,您可以說:

if [ "$#" -ne 1 ]; then
   echo "illegal number of parameters"
   exit 1
fi

要檢查參數是1、2還是3,可以使用以下正則表達式(請參閱相關內容 ):

if [[ ! $1 =~ ^(1|2|3)$ ]]; then
    echo "the number is not 1, 2 or 3"
    exit 1
fi

為了表達“輸入參數可以接受數字1或2或3”,我可以說“我們可以接受參數是1、2或3”。

首先,您可以通過執行以下操作來檢測字符串是空還是空:

if [ -z "$1" ]
  then
  echo "Argument $1 contains nothing"
fi

我想說這是您的第一步,它將允許您過濾出不包含任何內容的args。

然后,您很可能需要對$ 1,$ 2和$ 3進行一些比較工作

我將檢查一下,稍后再返回。

更新

只是不得不去找到我的腳本之一並檢查一下... :-)

我過去處理過Parm檢查的一種方式是如下所示

#!/bin/sh
while [ $# -gt 0 ] || [ "$#" -le 4 ]; do
  case "$1" in
    *[!1-9]*)   echo "Text: $1";;
    *)          echo "Number: $1"
  esac

  case "$2" in
    *[!1-9]*)   echo "Text: $2";;
    *)          echo "Number: $2"
  esac

  case "$3" in
    *[!1-9]*)   echo "Text: $3";;
    *)          echo "Number: $3"
  esac

  shift
done

基本上是一個簡單的正則表達式,如果我有0個以上的參數或4個以下的參數,則可以將其允許通過case語句,然后檢查每個參數的內容。

這個只是回聲,但是您可以輕松設置一些標志,然后根據這些標志決定如何繼續。

但是,對於簡單的范圍檢查,您可能只想使用類似於以下內容的一根襯管:

if [[ $# -gt 0 && $# -lt 4 ]]; then echo "Correct number of parameters"; fi

再次設置標志以供以后使用而不是回顯結果。

我假設您的意思是輸入只能是1、2或3,所以使用case語句是最好的方法。 $ 1是存儲參數的變量,如果等於1,則將在與值1對應的塊中執行代碼,依此類推。

 case "$1" in
        1) ...
        ;;
        2) ...
        ;;
        3) ...
        ;;
        *) echo "Invalid argument"
        ;;
     esac

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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