我有一个小脚本可以验证数据库服务器上的某些条件。我想在所有这些条件上模拟失败来测试脚本,所以我添加了以下行:
./print_results ${VAR1} ${VAR2} ... ${VARN}
如果任何变量的值不同于ZERO,则因为它失败了。
所以只是为了测试purpouses我添加了一行:
VAR1=1 ; VAR2=1 ; ... ; VARN=1
但是每次我想用假的结果替换真实结果时我都需要编辑文件。
这有什么问题?
[! -z $1 ] && [ "$1" == "Y"] && { echo "Debugging is ACTIVE" ; VAR1=1 ; ... ; VAR2=1 ; }
我希望在传递该行之后拥有VAR1..N = 1
。
感谢。
答案 0 :(得分:2)
问题是[
是一个命令,但[!
不是。编写代码可能更简洁:
test "{$1}" == Y && { echo "Debugging is ACTIVE"; VAR1=1 VAR2=1 ...; }
变量作业之间不需要分号,但它们不会受到伤害。
这是sh的瑕疵之一。出于某种原因,人们认为使用符号[
作为命令并将其作为参数传递给]
是个好主意,试图模仿语言中的大括号。不幸的是,这导致了大量的混淆,类似于这个问题所证明的。最好完全避免[
并始终拼写test
。这两个在功能上是相同的(除了[
命令必须具有]
作为最终参数),并且使用test
更加清晰。 (您希望test!
能够发挥作用吗?或者您是否认识到它需要写成! test
?)
答案 1 :(得分:1)
在" Y"之间需要一个空格。和]。非零测试毫无意义,但也需要[和。。
之间的空格[ "$1" == "Y" ] && { echo "Debugging is ACTIVE" ; VAR1=1 ; ... ; VAR2=1 ; }
你也考虑过把它写成if ... fi块吗?
答案 2 :(得分:0)
bash
提供了一种为不以其他方式设置的参数提供默认值的方法。据推测,您的代码有像
VAR1=$1
VAR2=$2
VAR3=$3
用
替换它们VAR1=${1-1}
VAR2=${2-1}
VAR3=${3-1}
例如,如果$1
未设置,则会为VAR1
分配值1而不是$1
的值。