如何使用N在bash中进行排列!输入?

如何使用N在bash中进行排列!输入?,bash,permutation,Bash,Permutation,我必须在bash中使用“eval”和“seq”命令进行排列。所以我必须先做一个可能包含相同数字的排列,然后我必须以某种方式过滤它 老师告诉我必须用两个周期,一个在另一个周期。但我不知道怎么做 输入如下: 3 输出应为: 123 132 213 231 312 321 如果有人能帮助我,那就太好了 编辑: 我想知道如何使用这些命令,我的朋友这样对我说: 老师告诉我这太好了,我们不在这个水平上。。我应该用seq和eval来做这件事,即使它没有那么好。第二个问题是输入是123,而不是3,比如3 这

我必须在bash中使用“eval”和“seq”命令进行排列。所以我必须先做一个可能包含相同数字的排列,然后我必须以某种方式过滤它

老师告诉我必须用两个周期,一个在另一个周期。但我不知道怎么做

输入如下:

3
输出应为:

123
132
213
231
312
321
如果有人能帮助我,那就太好了

编辑: 我想知道如何使用这些命令,我的朋友这样对我说:
老师告诉我这太好了,我们不在这个水平上。。我应该用seq和eval来做这件事,即使它没有那么好。第二个问题是输入是123,而不是3,比如3

这是一个排列问题,所以我发现其他人也做过。你可以看到答案

因此,通过答案,您可以编写如下代码:

perm() {
    local items="$1"
    local out="$2"
    local i
    [[ "$items" == "" ]] && echo "$out" && return
    for (( i=0; i<${#items}; i++ )) ; do
        perm "${items:0:i}${items:i+1}" "$out${items:i:1}"
    done
}

test() {
    local number="$1"
    local iniitem="$(seq -s' ' 1 ${number} | sed -n 's/ //g;p')"
    perm "$iniitem"
}

我知道这不是OP想要的seq+eval解决方案,但如果将来有人在寻找替代方案,这里有一个用awk编写的
generate()
函数的实现来解决这个问题:

$ cat tst.awk
function generate(n,A,  i) {
    if (n == 1) {
        output(A)
    }
    else {
        for (i=0; i<(n-1); i++) {
            generate(n-1, A)
            swap(A, (n%2?0:i), n-1)
        }
        generate(n-1, A)
    }
}

BEGIN{
    if (n>0) {
        for (i=1; i<=n; i++) {
            A[i-1] = i
        }
        generate(n, A)
    }
}

function output(a, i,g) {g=length(a); for (i=0;i<g;i++) printf "%s%s",a[i],(i<(g-1)?"":ORS)}
function swap(a,x,y, t) {t=a[x]; a[x]=a[y]; a[y]=t }

$ awk -v n=3 -f tst.awk | sort
123
132
213
231
312
321
$cat tst.awk
函数生成(n,A,i){
如果(n==1){
产出(A)
}
否则{
对于(i=0;i0){

对于(i=1;i如果有人好奇,以下是解决方案:

input=3
对于$(eval echo“{1..$input}{1..$input}{1..$input}”);do
OK=是
对于以美元表示的pos1(seq 0$((x,1));do
对于以美元表示的pos2(seq 0$((x,1));do
如果[$pos1!=$pos2];那么
如果[${i:$pos1:1}=${i:$pos2:1}];那么
OK=否
fi
fi
完成
完成
如果[$OK=yes];则
回声$i
fi
完成

你具体想知道什么?到目前为止你写了什么代码?如果你的老师在发布的示例之前教
eval
,你的优先顺序会受到严重怀疑。你能帮我个忙吗?:/问题。我不认为我做错了什么。是的,我知道,我没有你们这里的人好。这就是为什么我在这里。哈哈哈,非常好的比较:)我知道你是对的。谢谢你的回答!谢谢你的回答,但我必须使用这些命令(但非常感谢你们!只使用
eval
seq
,没有其他命令可以使用?如果你想输入is
123
,你可以使用
perm 123
。eval和seq yes..和两个循环/周期,一个在另一个。他告诉我先做一个“循环”排列,过滤它..输入必须是一个数字,比如:4,那么输出是1234,1243,1342,1324..等等。我不知道为什么你不能使用其他命令,如果你使用
eval
,你可以将程序更改为字符串,然后
eval'字符串'
,但是字符串也包含其他命令,比如
eval'echo>llo'
,echo
字符串也作为命令执行,可能效果相同。为什么编辑输入是
123
,而不是
3
,但您又说输入是
4
,两者冲突吗?
$ cat tst.awk
function generate(n,A,  i) {
    if (n == 1) {
        output(A)
    }
    else {
        for (i=0; i<(n-1); i++) {
            generate(n-1, A)
            swap(A, (n%2?0:i), n-1)
        }
        generate(n-1, A)
    }
}

BEGIN{
    if (n>0) {
        for (i=1; i<=n; i++) {
            A[i-1] = i
        }
        generate(n, A)
    }
}

function output(a, i,g) {g=length(a); for (i=0;i<g;i++) printf "%s%s",a[i],(i<(g-1)?"":ORS)}
function swap(a,x,y, t) {t=a[x]; a[x]=a[y]; a[y]=t }

$ awk -v n=3 -f tst.awk | sort
123
132
213
231
312
321