用于C ++ / C#/ Java程序员的最简单的Shell
我有点挣扎与bash编程,因为我似乎不理解语法规则。 例如:
read confirm
if [ "$confirm" == "yes" ]; then
echo "Thank you for saying yes"
else
echo "Why did you say no?"
fi
在这段代码中,你可以使用许多形式来做同样的事情:
"$confirm" == "yes"
$confirm == "yes"
"$confirm" == yes
$confirm == yes
那么规则是什么? 除此之外,它是非常严格的,所以如果你在'['和'''之间没有空格的情况下写上面的if语句,你会得到一个错误,所以我的问题是:
问候,
Rafid
规则很简单但很微妙。 你给出的例子并不完全相同,它们有不同的含义。 对于一个相当好的参考,你可以阅读Shell命令语言,它涵盖了POSIX shell。 大多数shell,当然包括bash,zsh和ksh,都是POSIX shell,并且至少会实现那里列出的内容。 一些外壳可能符合规范的早期版本或类似但不一致。
如果您正在学习Unix shell脚本,您需要记住的主要规则是:表达式由空格分隔。 从技术上讲,它们被变量$ IFS中列出的任何字符分隔,但这在正常情况下相当于空白。
如果在bash中说["$a"="$b"]
,那么shell会尝试将整个字符串作为命令读取,从而评估$ a和$ b。 假设价值$a
是文字a
和值$b
是字面b
,外壳会试图执行被称为命令[a=b]
这是一个合法的文件名。 引号被shell解释为特殊的,但是[
不是,因为只有写作单独的标记才是特殊的。 它没有被空格分开。
几乎你在shell中看到和做的每件事都是一个命令。 字符[
不是语法,它是一个命令。 命令采用由空格分隔的参数。 这些论点意味着什么,取决于命令,而不是外壳。 在C中, if ( a == b )
全部由解析器处理,除了a和b的值。 在bash中if [ "$a" == "$b" ]
首先由shell解析if [ "$a" == "$b" ]
,它评估变量$ a和$ b,然后执行命令[
有时候这是一个shell内置命令,有时它实际上是一个单独的可执行文件(查找/bin/[
在你的系统中))。 这意味着a == b ]
根本不被bash解释,而是一种特定于领域的语言,它被[
,也称为test
。 事实上, if test "$a" == "$b"
您可以编写代码。 在这种形式的test
中不需要关闭]
,但其他一切都是一样的。 要查看哪些test
将使用这些参数进行阅读help test
或man test
。
学习Unix shell脚本时要记住的另一个规则是:首先扩展变量,然后再次评估命令。 这意味着如果你在一个变量中有一个空格,例如foo="ab"
那么在变量被展开后,shell会看到空格: ls $foo
本身会抱怨它找不到文件a
并且找不到文件文件b
。 为了获得您可能期望从其他语言获得的行为,您几乎总是会引用您的变量: ls "$foo"
,它指示shell将扩展变量视为单个字符串而不重新标记。
壳牌脚本充斥着古怪的东西,但它不是非理性的(至少不是大部分时间)。 一些历史疣确实存在,但一旦掌握了基本知识,就没有多少规则要记住。 只是不要指望它像传统的C语言一样操作,你不会感到太惊讶。
一个问题是,如果你这样做:
if [ $foo == "bar" ] ...
然后$ foo是空的,你会得到一个语法错误。 这可以通过例如
# prepend both with an 'x' (or any other char)
if [ x$foo == "xbar" ] ..
# or enclosing in quotes (not sure this works on all shells)
if [ "$foo" == "bar" ] ...
将内容放入引号中也可确保保留空白以进行比较。
今天,还有其他更高级的方法可以在if语句中使用表达式,例如双括号
if [[ $foo == bar ]]
看到这个SO问题的更多细节。
至于选择哪种脚本语言学习,我建议学习bash,因为这是迄今为止最常见的一种。 如果你想编写可移植的脚本,然后限制自己的方式不是先进的,但应该由几乎所有的unix shell支持。
对于C风格的程序员来说,C语言可能更容易学习语法(因为语法与C更紧密地匹配),但它在野外并不常见
bash中最基本的语法规则是:
<command> <space>+ <arguments>
也就是说,命令和参数必须由一个或多个空格分隔。 [
是一个命令,因此在错误后省略空格。
至于哪个“更好”,我回应j_random_hacker的评论:
所有的shell语言都很糟糕,尽管有些比其他语言更可怕,并且都比Windows的cmd.exe更好。 我的建议是坚持bash,这是最流行的。
链接地址: http://www.djcxy.com/p/97039.html