如何在sh中运行十六进制转换

时间:2018-10-29 06:55:22

标签: bash sh subshell

我想使脚本/ bin / sh兼容。在某些时候,我正在使用十六进制变量的打印输出到其十进制值,但它会抛出此错误:

function createStore(reducer) {
  var listeners = [];

  function subscribe(listener) {
    listeners.push(listener);

    return function unsubscribe() {
      var index = listeners.indexOf(listener)
      listeners.splice(index, 1)
    };
  }

  return {subscribe};
}

var myObject = createStore("foo");
console.log(myObject);  // print an object with the subscribe method.
var myFunction = myObject.subscribe("bar");
console.log(myFunction);  // print the unsubscribe function

console.log(createStore("foo").subscribe("bar"));

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

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

这是为什么?如何在脚本中运行echo?

编辑: 子shell重定向到/ bin / dash

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

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

1 个答案:

答案 0 :(得分:4)

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而起作用。