我怎样才能从shell脚本中获得各种输出?

时间:2017-08-08 10:01:48

标签: linux shell sh

我不确定如何说出来(我有一个忘记一切的那些时刻),但我想创建一个脚本,它给了我所有可能的单词来自人物。

例如,如果我想要各种"空格",我可以在脚本中输入(s|S)/(p|P)/(A|a|4)/(C|c)/(e|3|E|ε)/(s|S|5|$),然后得到如下输出:

...
sP4C3s
SpaCe5
spACεS
Sp4C3$
...

等等,等等。我怎么能创造它?

(尝试顺便找到这个,但找不到任何有用的东西。可能我的措辞错了。)

1 个答案:

答案 0 :(得分:2)

您可以在bash中使用brace expansion

echo {s,S}{p,P}{a,A}{c,C}{e,E}{s,S}
  

空间舱间的空间舱间舱间舱间舱间舱间舱间舱间舱间舱间舱间舱间舱间舱间舱间空间舱间舱间舱间舱间舱间舱间舱间SPACS SPaces SPaceS SPACES SPACES SPaCes SPaCeS SPaCES SPAs SPA SPA SPA SPA SPA SPA SP SP SP SP SP SP SP SP

如果您想要换行符分隔,请使用

printf "%s\n" {s,S}{p,P}{a,A}{c,C}{e,E}{s,S}

要使其可重复使用,请将其放入函数中。但是,由于大括号扩展是shell执行的第一次扩展,因此您无法在不使用eval的情况下使用变量:

casecombinations() {
    local source brace_expr i char
    for source in "$@"; do
        brace_expr=""
        for ((i=0; i<"${#source}"; i++)); do
            char="${source:i:1}"
            case $char in
                [[:alpha:]]) brace_expr+="{${char,},${char^}}";;
                *) brace_expr+="\\$char";;
            esac
        done
        eval echo "$brace_expr"
    done
}
casecombinations hello world