什么 shell 最接近 C/C++ 语法?

Red*_*pha 6 command-line software-recommendation

我是 Linux 世界的新手,在过去一年左右的时间里,我一直在使用 Windows 并编写 Visual C++。我发现 bash 似乎是 Linux 世界中最受欢迎的 shell。是否有最接近 bash 功能但具有 C/C++ 类型语法的 Linux CLI shell?

gok*_*_uf 11

有符合要求的 CSH。

来自维基百科

C shell(csh 或改进版本,tcsh,在大多数机器上)是一种 Unix shell,由 Bill Joy 在 1970 年代后期在加州大学伯克利分校读研究生时创建。它已广泛分发,从乔伊于 1978 年开始分发的 BSD Unix 系统的 2BSD 版本开始。2其他早期对这些想法或代码的贡献者是 Michael Ubell、Eric Allman、Mike O'Brien 和 Jim Kulp。

手册页

或者你可以试试 TCSH(谢谢!@muru)

来自维基百科

tcsh (/?ti??si???l/ "tee-cee-shell", /?ti???l/ "tee-shell", or as a首字母缩写词 "tee cee ess aitch") 是一个 Unix shell基于并兼容 C shell (csh)。它本质上是具有可编程命令行完成、命令行编辑和一些其他功能的 C shell。与其他常见的 shell 不同,函数不能在 tcsh 脚本中定义,用户必须使用别名(如在 csh 中)。

请注意,这些 shell 不像 bash 那样被广泛使用,因此一些 makefile 和 shell 脚本的行为可能无法预测。

手册页

  • 总是首选在本地添加信息而不仅仅是链接,因为您是新手,我为您做了,看看这有多大用处。 (4认同)
  • [Tcsh](https://en.wikipedia.org/wiki/Tcsh) 适用于现代世界。 (3认同)

kos*_*kos 9

Bash 支持一些 C 风格的语法。例如:

  • 函数声明/定义在本质上类似于 C 中的函数声明/定义,除了您既不定义参数(使用位置参数$1, $2, $3, ... 获取)也不定义返回类型(Bash 根本不使用类型) ):

    foo() {
        # ...
    }
    
    Run Code Online (Sandbox Code Playgroud)

    或者再次类似于 C 使用内联声明/定义:

    foo() { #...; }
    
    Run Code Online (Sandbox Code Playgroud)

    需要注意的是,当使用内联声明/定义时,第一条和最后一条语句必须分别以空格分隔,{并且}(再次与 C 类似)每个语句必须与其他语句以分号分隔,并且最后的语句必须以分号:

    foo() { command1; command2; command3; }
    
    Run Code Online (Sandbox Code Playgroud)

    为完整起见,另一种声明/定义函数的方法是使用关键字function,它不需要()函数名称后的后缀:

    function foo {
        #...
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 您可以通过将它们括在双括号中来评估 C 样式表达式(()):支持相当多的 C 样式运算符(包括赋值),例如:=, >, >=, ==, !=, <, <=, &&, ||, !, 等等:

    $ i=0
    $ j=1
    $ ((i > j)) && echo True
    $ ((i >= j)) && echo True
    $ ((i == j)) && echo True
    $ ((i != j)) && echo True
    True
    $ ((i < j)) && echo True
    True
    $ ((i <= j)) && echo True
    True
    $ ((i && j)) && echo True
    $ ((i || j)) && echo True
    True
    $ ((\! i)) && echo True
    True
    $ ((\! j)) && echo True
    $ ((i = j))
    $ echo $i
    1
    $ echo $j
    1
    
    Run Code Online (Sandbox Code Playgroud)

    这种评估 C 风格表达式的方法可以与if,whileuntil语句结合使用:

    if((i == 0)); then
        # ...
    done
    
    Run Code Online (Sandbox Code Playgroud)
    while((i == 0)); do
        # ...
    done
    
    Run Code Online (Sandbox Code Playgroud)
    until((i == 0)); do
        # ...
    done
    
    Run Code Online (Sandbox Code Playgroud)

    最值得注意的是,(())还允许编写 C 风格的for循环条件:

    for((i = 0; i < 3; i++)); do
        # ...
    done
    
    Run Code Online (Sandbox Code Playgroud)
  • C 样式表达式求值不支持分配求值结果;为此,您可以使用算术扩展 ( $(())),它允许进行某种 C 风格的表达式赋值:

    $ i=0
    $ j=1
    $ k=$((i > j))
    $ echo $k
    0
    $ k=$((i < j))
    $ echo $k
    1
    $ x=$((1 + 2 + 3))
    $ echo $x
    6
    
    Run Code Online (Sandbox Code Playgroud)
  • 还支持 C 风格的前缀/后缀自增/自减运算符:

    ++i
    i++
    --i
    i--
    
    Run Code Online (Sandbox Code Playgroud)

  • @tac 好吧,这不是作业,而是比较(顺便说一下,您不需要转义`!`)。但是,是的,`((i=5))` 会起作用。罪魁祸首是你提到的类型的赋值(`x=foo`),因为通过用空格(`x = foo`)包围`=`,这不再被视为赋值,而是命令`x ` 使用参数 `=` 和 `foo` 调用。这清楚了吗? (2认同)
  • @RedDogAlpha `(())` 严格用于算术 - 一切都被视为整数。 (2认同)