用于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语句,你会得到一个错误,所以我的问题是:

  • 任何人都可以给我一个关于shell脚本语法的基本规则的想法吗? 如果你愿意,你可以称它为语法。
  • 据我所知,有三种不同的shell编程脚本。 对C ++,C#和Java等语言的程序员来说,哪一种是最容易学习的?
  • 问候,
    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 testman 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

    上一篇: Easiest Shell for C++/C#/Java Programmers

    下一篇: Raise error in a Bash script