foo=bar
$foo="whose value is this" #Note the dollar sign!
echo The value of foo is $foo
echo The value of bar is $bar
这将打印出:
The value of foo is foo
The value of bar is whose value is this
如果使用set -xv
命令,你会看到$foo="whose value is this"
之前它扩大到bar=whose value is this"
被执行。
在伯恩风格炮弹像Kornshell和BASH的if
语句是不是你认为它是。该if
命令执行语句,并选择如果条款如果命令返回零值。例如:
cat "foo" > my_file #Create a one line file with the string foo in it.
if grep -q "foo" my_file #grep command will return a zero exit code if it finds foo
then
echo "The string 'foo' is in file my_file"
fi
注意,如果条款不是布尔声明。这是一个执行的实际命令。
某处在Unix的发展初期,test
命令创建。你可以做一个男性测试,看看如何使用它。
的test
命令允许你这样做:如果你这样做
foo=3
bar=3
if test foo -eq bar
then
echo "foo and bar are equal"
else
echo "foo and bar are not equal"
fi
:
$ ls -li /bin/test /bin/[
你会看到一个命令调用[
确实存在,而且是硬链接test
命令。这是为了让一个if
声明看起来更像是一个if语句,你会经常编程语言看:
foo=3
bar=3
if [ foo -eq bar ]
then
echo "foo and bar are equal"
else
echo "foo and bar are not equal"
fi
完全一样的脚本以上,但[
,而不是test
。
这就解释了为什么在很多测试中(这是test
命令的一个参数,并且参数以短划线开头)需要短划线。这也解释了为什么您需要在[
和]
附近有空格。这些是实际的Unix命令,Unix命令周围必须有空格,所以shell可以处理它们。
另一个问题是,为什么有壳两套不同的字符串和数字测试。这是因为字符串可能只包含数字,但不是真正的数字。例如,如果你做库存,你可能有一个零件号001
和01
。在数字上,它们是平等的,但是作为字符串,它们是两个不同的字符串。 shell脚本无法知道。相反,您必须让shell脚本知道它是数字比较还是字符串比较。
Perl也有类似的问题,因为你不变量声明为数字或非数字:
Shell Script Perl
Boolean Operator Numeric String Numeric String
=================== ======= ====== ======= ======
Equals -eq = == eq
Not Equals -ne != != ne
Greater Than -gt > > gt
Less Than -lt < < lt
Greater or Equals -ge >= >= ge
Less Than or Equals -le <= <= le
你可以尝试一些其他的东西:
$ echo "*" #Echos the asterisk
$ echo * #No quotes: Prints all files in current directory
通知再次壳扩张执行前的*
的回声命令。这是一个shell脚本和一个典型的编程语言之间的主要区别。壳第一确实膨胀(填环境变量,水珠替代,运行子命令),它实际上执行命令之前。
set -xv
会告诉你什么命令正在执行,以及如何在执行之前shell命令扩展命令。做set +xv
会关闭。玩这个,你很快就会明白壳更好一点。
我希望我的无知会被原谅:我是比较新的bash编程,其语法不像我见过的其他任何编程语言。 – 2013-04-07 21:12:06