我正在嘗試編寫一個採用選項的bash腳本。 我們稱這些選項爲A和B.將Bash命令行選項轉換爲變量名稱
在腳本A和B中可能會或可能不會被定義爲變量。
我希望能夠檢查變量是否定義。
我已經嘗試了以下,但它不起作用。
if [ ! -n $1 ]; then
echo "Error"
fi
感謝
我正在嘗試編寫一個採用選項的bash腳本。 我們稱這些選項爲A和B.將Bash命令行選項轉換爲變量名稱
在腳本A和B中可能會或可能不會被定義爲變量。
我希望能夠檢查變量是否定義。
我已經嘗試了以下,但它不起作用。
if [ ! -n $1 ]; then
echo "Error"
fi
感謝
不要那樣做,試試這個:
if [[ -z $1 ]]; then
echo "Error"
fi
錯誤在你的版本實際上是引用缺乏。
應該是:
if [ ! -n "$1" ]; then
echo "Error"
fi
但你並不需要否定,使用-z
代替。
如果您使用Bash,則使用雙括號[[
]]
。
-z string True if the length of string is zero. -n string True if the length of string is non-zero.
另外,如果你使用bash V4或更高(bash --version
)有-v
-v varname True if the shell variable varname is set (has been assigned a value).
你沒有定義如何:
從man bash
頁面
這些選項應該通過,但我認爲:
if [ -z "$1" ]; then
echo "Error"
exit 1
fi
是你在找什麼。
然而,如果一些選項是,呃,可選的,那麼你可能想是這樣的:
#!/bin/bash
USAGE="$0: [-a] [--alpha] [-b type] [--beta file] [-g|--gamma] args..."
ARGS=`POSIXLY_CORRECT=1 getopt -n "$0" -s bash -o ab:g -l alpha,beta:,gamma -- "[email protected]"`
if [ $? -ne 0 ]
then
echo "$USAGE" >&2
exit 1
fi
eval set -- "$ARGS"
unset ARGS
while true
do
case "$1" in
-a) echo "Option a"; shift;;
--alpha) echo "Option alpha"; shift;;
-b) echo "Option b, arg '$2'"; shift 2;;
--beta) echo "Option beta, arg '$2'"; shift 2;;
-g|--gamma) echo "Option g or gamma"; shift;;
--) shift ; break ;;
*) echo "Internal error!" ; exit 1 ;;
esac
done
echo Remaining args
for arg in "[email protected]"
do
echo '--> '"\`$arg'"
done
exit 0
「正確」的方式來測試一個變量是否被設置爲使用+
擴展選項。你會看到在configure
腳本這個有很多:
if test -s "${foo+set}"
如果它被設置在那裏${foo+set}
擴展到"set"
或""
如果它不是。這可以讓變量設置爲空,如果你需要的話。 ${foo:+set}
此外還要求$foo
不能爲空。
(那$(eval echo $a)
事情有問題:它很慢,而且它很容易受到代碼注入(!)的影響。)
噢,如果你只是想拋出一個錯誤,如果沒有設置所需的東西,你可以參考變量${foo:?}
(離開:
如果設置但空是允許的),或爲一個自定義錯誤消息${foo:?Please specify a foo.}
。
我喜歡這和[PE](http://mywiki.wooledge.org/BashGuide/Parameters#Parameter_Expansion)很好。這裏也只是想提一下,在我的回答中,bash v4 +(iirc)提供了'-v'測試來表示是否設置了一個變量。 – c00kiemon5ter
請問這個問題的幫助:http://stackoverflow.com/questions/402377/using-getopts-in-bash-shell-script-to-get-long-and-short-command-line-options – Dave