命令内的 Bash 参数替换

命令内的 Bash 参数替换

我有一个短暂的了解参数替换,包括像这样的子字符串

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

相关内容