是否可以编写一个 bash 脚本,将一个 4 位数字作为命令行参数,并仅使用纯 bash 生成该数字的所有排列?
答案1
这是可能的。这里有一个函数可以完成你要求的事情。
function permutate {
if [ "${#1}" = 1 ]; then
echo "${2}${1}"
else
for i in $(seq 0 $((${#1}-1)) ); do
pre="${2}${1:$i:1}"
seg1="${1:0:$i}"
seg2="${1:$((i+1))}"
seg="${seg1}${seg2}"
permutate "$seg" "$pre"
done
fi
}
像这样运行:
$ permutate 1234
它通过使用递归来工作。每次调用该函数都会从字符串中取出一个字符,并以递归方式将其余部分传递给自身。因此,如果输入是 1234,它会被分解为前缀和剩余段四次,如下所示:1 234
2 134
3 124
4 123
。然后,三个字符段得到相同的处理,然后是两个字符段,然后当段只有一个字符时,递归停止。
答案2
大量滥用该shuf
命令,我意识到这使得它不是纯粹的 bash:
damson$ cat shell-combinations
#!/bin/bash
R=1000
PERM_OR_COMB=perm
if [ $PERM_OR_COMB = perm ]; then
C_RANGE=$#
else
C_RANGE=$(seq 0 $#)
fi
for C in $C_RANGE; do
for I in $(seq 1 $R); do
echo "$(for X in "$@"; do echo "$X"; done | shuf -n $C | paste -s -d' ')"
done | sort -u
done
damson$ ./shell-combinations 1 2 3 4
1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
1 4 2 3
1 4 3 2
2 1 3 4
2 1 4 3
2 3 1 4
2 3 4 1
2 4 1 3
2 4 3 1
3 1 2 4
3 1 4 2
3 2 1 4
3 2 4 1
3 4 1 2
3 4 2 1
4 1 2 3
4 1 3 2
4 2 1 3
4 2 3 1
4 3 1 2
4 3 2 1
damson$
显然它很慢,而且理论上也不可靠,但根据您的使用情况以及与R
相比的大小$#
,它可能会满足您的需求。更改PERM_OR_COMB=perm
为PERM_OR_COMB=comb
以获取所有组合而不是所有排列。