创建一个 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
是否可以创建一个名称中包含变量的别名(即 没有 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