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
如果參數太少,通常需要退出。