我有一个短暂的了解参数替换,包括像这样的子字符串
foo="Hello World";
greeting=${foo:0:6}
但我可以用命令来做到这一点吗?
greeting="Hello"
md5greeting=$(echo $greeting | md5sum :0:6)
>>b1946a
其中输出是“hello”的 md5sum 的前 6 个字符。
我该如何实现这一目标?
答案1
参数替换不是这样工作的,至少在 bash 中不是这样。您需要一个真实的变量(参数)并直接对其进行操作。例如这样:
var=$(echo abcdefgh | cmd1 | cmd2 | ... )
var2="${var:2:4}"
例外的是zsh
您可以将命令替换转换为“即时”参数并在一行中执行上述操作:
var2=${"$(echo abcdefgh | cdm1 | cmd2 | ... )":2:4}
答案2
注意:
echo $greeting | md5sum
或者更可靠的是:
printf '%s\n' "$greeting" | md5sum
不提供变量内容的 MD5 哈希值,而是提供变量内容后跟换行符的 MD5 哈希值。对于变量内容的 MD5 哈希:
printf %s "$greeting" | md5sum
对于它的前 6 个字节,有一些head
实现:
printf %s "$greeting" | md5sum | head -c 6
或更便携:
printf %s "$greeting" | md5sum | dd bs=1 count=6 2> /dev/null