【问题标题】:POSIX sh questions (printf and 'read -n')POSIX sh 问题(printf 和 'read -n')
【发布时间】:2019-02-27 22:55:49
【问题描述】:

我尝试以 POSIX 方式编写脚本,没有任何 bashism。而且我遇到了以下我自己无法解决的问题:

  1. 我知道这是一个愚蠢的问题,但到目前为止我还不太明白如何将这两个命令组合在一起。

     printf ' Port: '
     printf %s "$request" | xmllint --xpath 'string(/Server/Port)' -
    

    有可能吗?

  2. 我的脚本中有以下块:

     printf '\n\n\nGo? (Y) '
     read -n 1 y
     printf '\n\n'
     case $y in
              y|Y ) printf %s "$request" | xmllint --format - ; printf '\n';;
     esac
    

    但是,在 POSIX 中,-n 中的 read -n 1 y 是未定义的。是否可以以 POSIX 方式进行?

【问题讨论】:

  • 在 2 个单独的问题中提出两个问题。另外,Q1 中的“组合”是什么意思?
  • 我认为他们想要 echo " Port: $( echo -n "$request" | xmllint --xpath 'string(/Server/Port)' - )" 之类的东西,但在 POSIX 而不是 Bash 中。
  • @choroba 类似: printf ' 端口: ' %s "$request" | xmllint --xpath 'string(/Server/Port)' -
  • @ChaiT.Rex 对。

标签: bash sh posix


【解决方案1】:

要以 POSIX 方式读取 1 个字符,您可以这样做

y=$(dd bs=1 count=1 2>/dev/null)

y=$(head -c 1) 也不是 POSIX。)有关https://unix.stackexchange.com/questions/464930/can-i-read-a-single-character-from-stdin-in-posix-shell 的更多信息

你可以组合

printf ' Port: '
printf %s "$request" | xmllint --xpath 'string(/Server/Port)' -

使用 &&; 或换行符。

就像chai-t-rex 指出的那样,

printf ' Port: %s' "$(printf %s "$request" | xmllint --xpath 'string(/Server/Port)' -)"

也是可能的,但它不会带来任何好处。它所做的只是稍微重新组织您的代码,同时由于启动了不必要的命令替换过程而引入了轻微的性能悲观。

【讨论】:

    猜你喜欢
    • 2012-08-23
    • 2015-03-24
    • 2014-04-26
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 2014-03-09
    相关资源
    最近更新 更多