我正在研究如何在不使用 Bash 中的递归的情况下生成一组数字的所有非重复排列,我发现这个答案有效,但我想了解原因。
假设您有三个数字:1、2、3。
以下命令将生成所有可能的非重复排列:
printf "%s\n" {1,2,3}{1,2,3}{1,2,3} | sort -u | sed '/\(.\).*\1/d'
123
132
213
231
312
321
Run Code Online (Sandbox Code Playgroud)
我理解当参数是集合 {1, 2, 3} 的大括号扩展三倍时printf
with 的%s
作用(这将打印每个可能的结果)。
我知道这sort -u
只会输出唯一的行。
我知道这sed /<pattern>/d
用于删除任何匹配的行<pattern>
。
读了里面的模式sed
,我有些糊涂了。我知道如何阅读,regex
但我没有看到这种模式在sed
命令中是如何工作的。
\( = literal '('
. = any character, once
\) = literal ')'
.* = any character, zero or more times
\1 = reference to first captured group
Run Code Online (Sandbox Code Playgroud)
那么该sed
命令如何从此regex
模式中删除非唯一值?我不明白如何引用一个被捕获的组,而实际上没有一个?在模式中使用括号进行字面匹配?在 …
在研究有关 Bash 子 shell 的更深入信息时,我遇到了一个有趣的执行,我想了解它为何有效。执行涉及将字符串分配给变量,然后在man
调用时使用该变量,链接到原始示例。我已经读过为什么LESS
在该示例中使用特定变量(在许多发行版中man
作为less
默认分页器),我不明白的是命令执行后的变量赋值如何在没有任何类型的分隔元字符的情况下工作。
LESS=+/'OPTIONS' man man
man
直接在该部分下打开命令的手册页OPTIONS
。它适用于直接使用less
太打开的文件(这使我相信该LESS
变量的使用less
方式与在“会话”中进行正则表达式搜索相同less
)。该LESS
变量不会被导出,它永远不会保存在当前的 shell 环境中(执行不会echo $LESS
返回任何内容),那么如何less
捕获该值呢?
为什么这有效,但不是类似的东西foo='hello' echo $foo
?;
仅当变量赋值和命令执行之间包含命令分隔符 ( ) 时,这种情况才有效。我什至尝试过foo=+'hello' echo $foo
以防万一=+
在 Bash 中做了一些我不知道的事情,但输出没有变化。
欢迎任何解释或阅读材料!
当我遇到一个有趣的结果时,我正在忙于捕获退出代码、重定向stdout
和stderr
案例声明,我希望有人能够阐明这一点。
我使用的是 bash 5.1.16。
该块可用于复制我所看到的行为:
#!/bin/sh -x
cleanup () {
case $? in
1) echo "message 1" ;;
9) echo "message 2" ;;
esac
}
trap cleanup EXIT
case 0 in
0) exit 1 ;;
2) echo "yay" ;;
esac > /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)
xtrace 输出> /dev/null 2>&1
:
+ trap cleanup EXIT
Run Code Online (Sandbox Code Playgroud)
xtrace 输出不带> /dev/null 2>&1
:
+ trap cleanup EXIT
+ case 0 in
+ exit 1
+ cleanup
+ case $? in …
Run Code Online (Sandbox Code Playgroud)