POSIX sh 支持哪些类型的字符串插值?

mca*_*dre 12 shell bash shell-script posix

"${blah}"在 POSIX sh 中是允许的,还是需要 bash 派生的 shell?

Gil*_*il' 20

"${blah}"并且"$blah"是可移植的 shell 语法:它们适用于所有符合 POSIX 的 shell 以及传统的 Bourne shell。POSIX 还需要变量扩展的其他特性:

  • 字符串操作有${VAR#PREFIX}${VAR##PREFIX}${VAR%SUFFIX}${VAR%%SUFFIX}
  • 与未设置变量的条件处理${VAR-DEFAULT}${VAR=DEFAULT}${VAR+FALLBACK}${VAR?MESSAGE}以及与未设置,或空的变体:-:=:+:?
  • 可变长度${#VAR}

在所有情况下,请记住,除非在双引号中(或其他一些不允许多个单词的上下文),否则结果会$…经历空格拆分(更准确地说,在$IFS字符处拆分)和通配符扩展(通配符)。

您可以通过阅读规范来查找 POSIX 中存在的内容。POSIX 的现代版本与Open Group 基本规范相同(没有可选组件)。旧版本是Single Unix v2的子集。

如今,没有 POSIX shell 的类 Unix 系统极为罕见。/bin/sh是一些系统上的非 POSIX Bourne shell,特别是 Solaris,但 POSIX shell 是可用的(/usr/xpg4/bin/sh在 Solaris 上,你应该在你的 PATH 中/usr/xpg4/bin提前/usr/bin)。如果您需要与 Bourne shell 兼容,请查看您感兴趣的系统上的手册页,因为有许多版本的 sh 具有略有不同的功能集。Sven Mascheck 维护了一个包含大量信息的页面

  • 我这辈子你的答案哪来的!+1 (2认同)

B L*_*yer 4

在 POSIX 规范中关于参数扩展的部分说......

参数扩展的格式如下:

${表达式}

其中表达式由匹配“}”之前的所有字符组成。

剪断

参数扩展的最简单形式是:

${参数}

然后在双引号部分......

用双引号 ( "" ) 括起来的字符应保留双引号内所有字符的字面值,但字符反引号、 和 除外,如下所示:

$美元符号应保留其引入参数扩展(请参阅参数扩展)、命令替换形式(请参阅命令替换)和算术扩展(请参阅算术扩展)的特殊含义。

所以,是的。