win10 - windows bash教學




檢查Bash shell腳本中是否存在輸入參數 (6)

作為一個小提醒,Bash中的數字測試運算符只能用於整數( -eq-lt-ge等)

我喜歡確保我的$變數是由整數

var=$(( var + 0 ))

在我測試它們之前,只是為了防禦“[:integer arg required”錯誤。

我需要檢查輸入參數的存在。 我有以下腳本:

if [ "$1" -gt "-1" ]
  then echo hi
fi

我明白了

[: : integer expression expected

如何首先檢查輸入參數1以查看它是否存在?


另一種檢測參數是否傳遞給腳本的方法:

((!$#)) && echo No arguments supplied!

請注意, (( expr ))會按照Shell算法的規則評估表達式。

為了在沒有任何爭論的情況下退出,可以說:

((!$#)) && echo No arguments supplied! && exit 1

另一種(類似的)說法的方式是:

let $# || echo No arguments supplied

let $# || { echo No arguments supplied; exit 1; }  # Exit if no arguments!

help let說:

let: let arg [arg ...]

  Evaluate arithmetic expressions.

  ...

  Exit Status:
  If the last ARG evaluates to 0, let returns 1; let returns 0 otherwise.

如果您只想檢測是否缺少特定參數,則參數替換非常重要:

#!/bin/bash
# usage-message.sh

: ${1?"Usage: $0 ARGUMENT"}
#  Script exits here if command-line parameter absent,
#+ with following error message.
#    usage-message.sh: 1: Usage: usage-message.sh ARGUMENT

在某些情況下,您需要檢查用戶是否將參數傳遞給腳本,如果不是,則回退到默認值。 就像下面的腳本一樣:

scale=${2:-1}
emulator @$1 -scale $scale

這裡如果用戶沒有通過scale作為第二個參數,我默認啟動帶有-scale 1的Android模擬器。 ${varname:-word}是一個擴展操作符。 還有其他擴展操作符:

  • ${varname:=word}設置未定義的varname而不是返回word值;
  • ${varname:?message}如果varname被定義並且不為空或者打印該message並放棄腳本(如第一個例子),則返回varname ;
  • ${varname:+word}僅當varname被定義並且不為空時才返回word ; 否則返回null。

如果您想檢查參數是否存在,您可以檢查參數的數量是否大於或等於您的目標參數數量。

以下腳本演示了這是如何工作的

test.sh

#!/usr/bin/env bash

if [ $# -ge 3 ]
then
  echo script has at least 3 arguments
fi

產生以下輸出

$ ./test.sh
~
$ ./test.sh 1
~
$ ./test.sh 1 2
~
$ ./test.sh 1 2 3
script has at least 3 arguments
$ ./test.sh 1 2 3 4
script has at least 3 arguments

我經常使用這段代碼來製作簡單的腳本:

#!/bin/bash

if [ -z "$1" ]; then
    echo -e "\nPlease call '$0 <argument>' to run this command!\n"
    exit 1
fi

用這種方式演示更好

if [[ $# -eq 0 ]] ; then
    echo 'some message'
    exit 1
fi

如果參數太少,通常需要退出。





shell