Bash 分解随机字符串

Bash 分解随机字符串,bash,random,Bash,Random,如何“爆炸”一个随机字符串? 我追求的是; 取n个长度的随机字符串 characters=$(</dev/urandom tr -dc '1234567890{}[]`~\/><!@#$%^&*()_+=-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' | head -c${n}) 其中k是“爆炸”长度 最后,我想在每个字符下设置一个胡萝卜“^”,并让它跟随键入的内容 请参阅我的另一篇文章您可以使用bash提

如何“爆炸”一个随机字符串? 我追求的是; 取n个长度的随机字符串

characters=$(</dev/urandom tr -dc '1234567890{}[]`~\/><!@#$%^&*()_+=-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' | head -c${n})
其中k是“爆炸”长度

最后,我想在每个字符下设置一个胡萝卜“^”,并让它跟随键入的内容


请参阅我的另一篇文章

您可以使用bash提供的整数数学功能来计算每个字符之间的空格数,以将字符串扩展到所请求的最大大小
k
(每个字符之间的空格数相等,注意
n
字符之间有
n个
插槽可扩展)

您只需计算字符串的长度,就得到了要扩展到的请求大小,使用整数除法(有意截断),您可以在保持请求大小的同时计算每个字符之间可以放置的空格数。您可以通过以下方法来实现这一点:

#!/bin/bash

str="string to explode" ## string
len=${#str}             ## string length
k=$((${1:-70}))         ## exploded size requested

((k < len)) && {    ## validate requested size > length
    printf "error: width 'k' less than length '%d'\n" "$len"
    exit 1
}

sep=$((k/len))  ## max separation between chars (integer division)

((sep < 2)) && {    ## if 1, cannot explode 
    printf "%s (no expansion)\n" "$str"
    exit 0
}

sepst=""    ## set separator string
printf -v sepst "%*s" $((sep - 1)) " "

## insert sepst betwen each char
for ((i = 0; i < $((len - 1)); i++)); do
    printf "%s%s" ${str:$((i)):1} "$sepst"  ## str intentionally unquoted
done                                        ## (quote for preserve space)

## print final char
printf "%s\n" "${str: -1}"
要打印两侧带有分隔符的每个
空格
,请引用
“${str:$((i)):1}”
,它将保留(而不是省略)每个
空格
。(根据您的选择--它只会使空格更明显)

#!/bin/bash

str="string to explode" ## string
len=${#str}             ## string length
k=$((${1:-70}))         ## exploded size requested

((k < len)) && {    ## validate requested size > length
    printf "error: width 'k' less than length '%d'\n" "$len"
    exit 1
}

sep=$((k/len))  ## max separation between chars (integer division)

((sep < 2)) && {    ## if 1, cannot explode 
    printf "%s (no expansion)\n" "$str"
    exit 0
}

sepst=""    ## set separator string
printf -v sepst "%*s" $((sep - 1)) " "

## insert sepst betwen each char
for ((i = 0; i < $((len - 1)); i++)); do
    printf "%s%s" ${str:$((i)):1} "$sepst"  ## str intentionally unquoted
done                                        ## (quote for preserve space)

## print final char
printf "%s\n" "${str: -1}"
$ explodestr.sh
s   t   r   i   n   g      t   o      e   x   p   l   o   d   e
$ explodestr.sh
s   t   r   i   n   g       t   o       e   x   p   l   o   d   e