【问题标题】:How can I get Hex conversion working in sh如何在 sh 中进行十六进制转换
【发布时间】:2018-10-29 06:55:21
【问题描述】:

我想让脚本 /bin/sh 兼容。在某些时候,我正在使用将十六进制变量打印到十进制值,但它抛出了这个错误:

sh: 1: arithmetic expression: expecting EOF: "16#c0"

当脚本由 /bin/bash 执行时,该错误不存在。我把它归结为以下问题:

$ sh -c 'echo $((16#c0))'     
sh: 1: arithmetic expression: expecting EOF: "16#c0"

$ sh -c "echo $((16#c0))"    
192

为什么会这样?如何让 echo 在我的脚本中工作?

编辑: subshel​​l 被重定向到 /bin/dash

$ readlink -f $(which sh)
/bin/dash
$ type sh
sh is /bin/sh

【问题讨论】:

  • 你肯定需要bash -c '...'bash 执行它吗?
  • @MarkSetchell:我假设 OP 希望在符合 POSIX 的 shell 中执行此操作
  • 没错,我想让它由 sh 执行

标签: bash sh subshell


【解决方案1】:

sh(通常与 dash 等 POSIX shell 的 simlink 链接)不支持 [base#]n 形式的算术评估,就像 bash 支持的那样。

所以你需要在你的十六进制数字中使用0x 前缀:

sh -c 'echo $((0xc0))'

sh -c 'printf "%d\n" 0xc0'

请注意,您始终需要使用单引号来不让当前 shell 解释双引号字符串的内容。

所以你对

的尝试
sh -c "echo $((16#c0))"

看起来只是因为$((16#c0))bash 解释,而sh 执行的实际命令是echo 192

【讨论】:

  • 这很有帮助。我从没想过子外壳可能与“主机”外壳不同。有没有办法检查这个?
  • @user8162 试试type shreadlink -f $(which sh) 看看这是否是指向其他东西的符号链接。
  • 从技术上讲,没有子shell;您正在从 bash shell 运行程序 sh,而不是在同一进程中启动新的 shell。在执行sh 之前,双引号参数仅由bash 评估;你的第二次尝试相当于sh -c "echo 192"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-13
  • 2013-10-08
  • 1970-01-01
  • 1970-01-01
  • 2018-09-04
  • 1970-01-01
相关资源
最近更新 更多