创建一个 bash 别名,名称中有一个变量,不带 space

Create a bash alias with a variable in the name without space

是否可以创建一个名称中包含变量的别名(即 没有 space)?我想设置从六进制到二进制的转换快捷方式:

例如,当我输入:

0xff

我想显示以下内容:

11111111

想法大概是这样的(这个例子显然行不通):

alias 0x='echo "obase=2; ibase=16; " | bc'

不,在 bash 中,别名适用于单个单词。所以,除非你想这样做:

alias 0x00='echo 00000000'
alias 0x01='echo 00000001'

那么你就不会轻易让它工作。它 可以 使用该方法通过创建脚本来动态完成(在有限范围内),但它会导致很多别名:

( for i in {0..255} ; do printf "alias 0x%02x='echo %d'\n" $i $i ; done ) >xyzzy_$$.sh
source xyzzy_$$.sh
rm xyzzy_$$.sh

相反,我会选择一个函数 x,您可以这样做:

pax> x ff
11111111

没有比 0xff 需要的更多的击键,而且您不必担心试图强迫 bash 做一些它不是真正适合做的事情。

这样的函数可以通过以下方式创建:

pax> x() {
...>    val=$(tr '[a-z]' '[A-Z]' <<< )
...>    BC_LINE_LENGTH=0 bc <<< "ibase=16;obase=2;$val"
...> }

并按如下方式使用:

pax> x ff
11111111

pax> x 42
1000010

pax> x cB
11001011

pax> x 457365384563453653276537456354635635326535635345
10001010111001101100101001110000100010101100011010001010011011001010011001001110110010100110111010001010110001101010100011000110101011000110101001100100110010100110101011000110101001101000101

请注意使用 tr 将字母强制转换为大写值。否则,您可能会 运行 遇到 bc 将它们识别为有效的十六进制数字的问题。

还要注意 BC_LINE_LENGTH 的设置,以防止 bc 自动换行非常大的数字,例如最后一个您会看到的数字:

pax> y 457365384563453653276537456354635635326535635345
10001010111001101100101001110000100010101100011010001010011011001010\
01100100111011001010011011101000101011000110101010001100011010101100\
0110101001100100110010100110101011000110101001101000101

bash 别名不将变量作为输入。您可以改用函数:

$ hex_to_bin () { echo "obase=2; ibase=16; " | bc ;}

$ hex_to_bin 6A
1101010