Dag*_*bit 160 bash shell command substitution
在bash中执行命令替换的首选方法是什么?
我总是这样做:
echo "Hello, `whoami`."
Run Code Online (Sandbox Code Playgroud)
但最近,我经常看到它写得像这样:
echo "Hello, $(whoami)."
Run Code Online (Sandbox Code Playgroud)
什么是首选语法,为什么?或者他们几乎可以互换?
我倾向于赞成第一个,因为我的文本编辑器似乎知道它是什么,并且适当地进行语法高亮.
我在这里读到,在每种情况下,转义字符的行为都有所不同,但我不清楚哪种行为更可取,或者它只取决于具体情况.
附带问题:在一个脚本中使用两个表单是不好的做法,例如嵌套命令替换时?
小智 157
这里有几个问题/问题,所以我将重复海报文本的每一部分,块引用,然后是我的回复.
什么是首选语法,为什么?或者他们几乎可以互换?
我会说$(some_command)表格比表格更受欢迎`some_command`.第二种形式,使用一对反引号(""字符,也称为反引号和重音符号),是历史的方式.第一种形式,使用美元符号和括号,是一种较新的POSIX形式,这意味着它可能是一种更标准的方式.反过来,我认为这意味着它更有可能使用不同的shell和不同的*nix实现正常工作.
更喜欢第一种(POSIX)形式的另一个原因是它更容易阅读,特别是当嵌套命令替换时.另外,使用反引号形式,反引号字符必须在嵌套(内部)命令替换中进行反斜杠转义.
使用POSIX表单,您不需要这样做.
至于它们是否可以互换,我会说,一般来说,它们是可以互换的,除了你提到的转义字符的例外情况.但是,我不知道也不能说所有现代贝壳和所有现代*nix都支持这两种形式.我怀疑他们这样做,尤其是旧贝壳/旧款*nixes.如果我是你,如果没有首先在计划运行已完成脚本的任何shell/*nix实现上运行每个表单的几个快速,简单的测试,我将不依赖于可互换性.
我倾向于赞成第一个,因为我的文本编辑器似乎知道它是什么,并且适当地进行语法高亮.
不幸的是你的编辑似乎不支持POSIX表格; 也许你应该检查你的编辑器是否有支持POSIX方式的更新.可能是远射,但谁知道呢?或者,也许你甚至应该考虑尝试不同的编辑器.
GGG,你正在使用什么文本编辑器?
我在这里读到,在每种情况下,转义字符的行为都有所不同,但我不清楚哪种行为更可取,或者它只取决于具体情况.
我会说这取决于你想要完成的事情; 换句话说,您是否使用转义字符以及命令替换.
附带问题:在一个脚本中使用两个表单是不好的做法,例如嵌套命令替换时?
好吧,它可能会使脚本稍微容易阅读(从字面上讲),但更难理解!有人在阅读你的剧本(或者你,六个月后读它!)可能会想知道为什么你不只是坚持一种形式或另一种形式 - 除非你在评论中提出一些关于你为什么这样做的说明.另外,在一个脚本中混合两个表单会使该脚本不太可能是可移植的:为了使脚本正常工作,执行它的shell必须支持两种形式,而不仅仅是一种形式或另一种形式.
为了使shell脚本易于理解,我个人更喜欢在任何一个脚本中坚持使用一种形式或另一种形式,除非有一个很好的技术理由不这样做.而且,我更喜欢旧版本的POSIX表格; 再次,除非有一个很好的技术理由否则.
有关命令替换的主题以及执行此操作的两种不同形式的更多信息,我建议您参考O'Reilly一书中的"经典Shell脚本"第二版中的命令替换部分,作者Robbins和Beebe.在该部分中,作者声明命令替换的POSIX表单"建议用于所有新开发".我对这本书没有经济利益; 它只是我对shell脚本的一个(和爱),虽然它更适用于中间或高级shell脚本,而不是真正用于开始shell脚本.
-B.
kev*_*kev 41
您可以阅读bash手册中的差异.在大多数情况下,它们是可互换的.
有一点要提到的是你应该转义backquote到nest命令:
$ echo $(echo hello $(echo word))
hello word
$ echo `echo hello \`echo word\``
hello word
Run Code Online (Sandbox Code Playgroud)
反引号与古代shell相兼容,因此需要可移植的脚本(例如GNU autoconf片段)应该更喜欢它们.
特别$()是眼睛的形状更容易一些.经过几个级别的逃脱.
| 归档时间: |
|
| 查看次数: |
46141 次 |
| 最近记录: |