【问题标题】:What typeset -i2 var=2#0 means in bash/korn shell?typeset -i2 var=2#0 在 bash/korn shell 中是什么意思?
【发布时间】:2019-11-04 04:43:34
【问题描述】:

我在 korn shell 脚本中阅读了以下说明:

typeset -i2 var=2#0

我设法知道使用typeset 可以指定变量的类型,并且参数-i2 描述了该变量是一个整数,以基数2(二进制)解释。 但是,我仍然无法理解分配给变量 (2#0) 的值是什么意思。

谷歌搜索我发现像variable#pattern这样的指令意味着模式的出现将从变量的前面被删除,但情况似乎并非如此......

编辑:似乎-in 语法特定于 korn shell (ksh)

【问题讨论】:

  • 在 ksh sh (AT&T Research) 93u+ 2012-08-01 这个echo "$var" 只显示2#0 所以也许这只是这个变量的值,没有任何特殊意义?
  • @ArkadiuszDrabczyk:不,将var 初始化为二进制0。可以将 15 以二进制方式初始化为 2#1111
  • 这不是一个真正的bash 问题:bash: typeset: -2: invalid option,尽管 bash 确实在算术上下文中合并了“base#value”语法(typeset/declare/local -i 引入了:declare -i x=16#deadbeef; echo $x

标签: sh ksh


【解决方案1】:

typeset-i[n] 语法特定于 ksh,在 bash 中不可用。在您的尝试中,代码 -i2 表示以 2 为底的内容的输出,即作为二进制值。在ksh93

typeset -i2 var=15
echo "$var"

产生二进制值

2#1111

因此,按照这种逻辑,您的原始代码会在二进制 0 中初始化 var 的值。如果您使用 2#1111 进行初始化,那么标志的含义会更有意义。您不能在此语法中使用非基数 2 数字,因为它只会引发语法错误,即像 typeset -i2 var=2#15 这样的操作永远不会起作用。

请注意,typesetkshbash shell 中都是过时的构造。使用declare 提供了类似的选项以及更多。在bash 中,如果您在基数 2 中定义一个数字,您可以对相同的$((..)) 使用算术运算符

var='2#1111'
echo "$(( var ))"
15

但是没有内置的方法可以在不使用像 bc 这样的第三方工具的情况下从 bash 中的十进制进行基数 2 转换

echo 'obase=2;15' | bc
1111

【讨论】:

  • 使用 dc 的另一种方式:echo '15 2op' |直流
猜你喜欢
  • 1970-01-01
  • 2020-04-02
  • 2015-05-07
  • 2021-05-22
  • 2010-10-23
  • 2015-05-29
相关资源
最近更新 更多