Questions tagged «syntax»


3
$()是subshel​​l吗?
我知道subshel​​l语法为(<commands...>),$()仅仅是可以从中检索变量值的子shell? 注意:这适用于基于其文档中不同措辞的bash 4.4。
51 bash  subshell  syntax 



1
Bash脚本函数名称包含双冒号'::'
我今天遇到了一个Bash脚本,其中包含带有双冒号的函数名称::,例如file::write()和file::read()。我以前从未在Bash脚本中看到过这种语法,当我调用该脚本时,它运行得很好(令我惊讶)。 在系统上(和在线)上查看Bash的手册页后,我在文档中找不到支持此函数名语法的任何内容。例如,本节Shell Defined Functions将shell函数的语法定义为 function name [()] compound-command [redirection] 然后(在手册的其他地方)令牌name定义为 name A word consisting only of alphanumeric characters and underscores, and beginning with an alphabetic character or an underscore. Also referred to as an identifier. 没有任何提及函数名的双冒号语法。 到目前为止,我在此《Shell Style Guide》(请参阅小节Naming Conventions > Function Names)中找到了对此双冒号语法的唯一其他参考,该指南建议对“包”中的函数名使用双冒号语法-例如,mypackage::myfunction()。 函数名称的这种双冒号语法是Bash shell的合法功能,还是未公开的功能?如果合法,Bash手册中将其记录在哪里?我已经看了看,但是在手册中找不到任何有关它的信息。我发现最接近的是::在PATH环境变量中使用,将当前工作目录添加到搜索路径。 例 #!/bin/bash function abc::def() { …

2
如何传递参数以在bash脚本中起作用?
我想编写一个可以从带有许多不同变量的脚本中调用的函数。由于某些原因,我在执行此操作时遇到很多麻烦。我读过的示例始终仅使用全局变量,但就我所知,这不会使我的代码更具可读性。 预期的用法示例: #!/bin/bash #myscript.sh var1=$1 var2=$2 var3=$3 var4=$4 add(){ result=$para1 + $para2 } add $var1 $var2 add $var3 $var4 # end of the script ./myscript.sh 1 2 3 4 我尝试$1在函数中使用诸如此类,但随后只需要调用整个脚本的全局范围即可。基本上,我正在寻找类似的东西$1,$2诸如此类,但是在函数的本地上下文中。如您所知,函数可以使用任何适当的语言来工作。

6
shebang(脚本声明)行过多-有什么方法可以减少行数?
我有一个包含约20个小.sh文件的项目。我将这些名称命名为“小”,因为通常没有文件包含超过20行的代码。我之所以采用模块化方法,是因为我忠于Unix理念,并且对我来说维护项目更容易。 在每个.sh文件的开头,我放置了#!/bin/bash。 简而言之,我了解脚本声明有两个目的: 它们帮助用户回忆起执行该文件所需的外壳程序(例如,几年后不使用该文件)。 他们确保脚本仅在特定外壳程序(在这种情况下为Bash)下运行,以防止在使用其他外壳程序的情况下出现意外行为。 当一个项目开始从5个文件增长到20个文件或从20个文件增长到50个文件时(不是这种情况,只是为了演示),我们有20行或50 行的脚本声明。我承认,即使对某些人来说可能很有趣,但我对使用20或50而不是每个项目只说1个(也许在项目的主文件中)感到有点多余。 有没有一种方法可以通过在某些主文件中使用一些“全局”脚本声明来避免所谓的20或50或更多行的脚本声明冗余?

1
为什么不能为while循环反转输入重定向操作符的顺序?
在Bash中,您可以将输入重定向操作符移动到命令的前面: cat <<< "hello" # equivalent to <<< "hello" cat 为什么while循环无法执行相同的操作? while read -r line; do echo "$line"; done <<< "hello" # hello <<< "hello" while read -r line; do echo "$line"; done # -bash: syntax error near unexpected token `do' 我发现这有点令人困惑,因为您可以使用while循环。我是在做错什么还是仅仅是设计决定?

2
括号命令组为什么在POSIX Shell语法中的左括号之后需要空格?
TL; DR:为什么POSIX大括号组在{保留字之后需要空格,但是在保留字之后不需要subshel​​l (? POSIX Shell语法定义了括号组和子shell,如下所示 brace_group : Lbrace compound_list Rbrace subshell : '(' compound_list ')' 现在,如果从字面上看,空格是很重要的。这将意味着必须有空间来描述开括号和闭括号以及括号,如 { echo hello world; } ( echo hello world ) 这也将与“ 复合命令”定义保持一致: 这些复合命令中的每一个在开头都有一个保留字或控制运算符,在结尾处有一个对应的终止符保留字或运算符。 但是,没有意义的是为什么(list)并且可以( list )正常工作((不需要后面的空格),但是括号扩展必须有一个前导空格,即{echo hello;}不起作用。 当然,保留字被视为空壳字会有意义,之后需要一个空格以与字段拆分的概念保持一致,但是定义本身并未提及空格。此外,如果POSIX的复合命令定义都将{和(都视为保留字,那么为什么在这些保留字之后的空格字符方面会有不同的对待?现在,ksh(1)手册确实指出: 单词是字符序列,由无引号的空格字符(空格,制表符和换行符)或元字符(<,>,|,;,&,(和))定界 换句话说,有意义的是ksh将被识别(为单词定界符,其中第一个单词将是命令或变量赋值。POSIX,但是似乎没有提到(元字符。就POSIX语法而言,我发现的唯一可能的解释是{被认为是“令牌”,此处(未列出为一个。 /* These are reserved words, not operator tokens, and are recognized when reserved words …
10 shell  posix  subshell  syntax 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.