我了解什么是大括号扩展,但我不知道如何最好地使用它。
你什么时候使用它?
如果你有自己的小窍门,请教我一些方便和出色的例子。
当我使用以下内容时,我得到了预期的结果:
$ echo {8..10}
8 9 10
Run Code Online (Sandbox Code Playgroud)
如何以简单的方式使用此大括号扩展以获得以下输出?
$ echo {8..10}
08 09 10
Run Code Online (Sandbox Code Playgroud)
我现在认为这可以使用seq
(没有尝试)获得,但这不是我想要的。
有用的信息可能是我仅限于这个 bash 版本。(如果您有zsh
解决方案,但没有bash
解决方案,也请分享)
$ bash -version
GNU bash, version 3.2.51(1)-release (x86_64-suse-linux-gnu)
Run Code Online (Sandbox Code Playgroud) 我想$var in
在 bash 中使用带有范围的 shell 括号扩展。简单地放置{$var1..$var2}
不起作用,所以我去了“横向”......
以下工作,但它有点笨拙。
# remove the split files
echo rm foo.{$ext0..$extN} rm-segments > rm-segments
source rm-segments
Run Code Online (Sandbox Code Playgroud)
有没有更“正常”的方式?
a[bc]d
和 和有a{b,c}d
什么区别?为什么人们a{b,c}d
在已经有的时候使用a[bc]d
?
我有大约 15,000 个名为file_1.pdb
、file_2.pdb
等的文件。我可以通过执行以下操作来按顺序对其中的几千个文件进行分类:
cat file_{1..2000}.pdb >> file_all.pdb
Run Code Online (Sandbox Code Playgroud)
但是,如果我对 15,000 个文件执行此操作,则会出现错误
-bash: /bin/cat: Argument list too long
Run Code Online (Sandbox Code Playgroud)
我已经看到通过这样做解决了这个问题,find . -name xx -exec xx
但这不会保留文件加入的顺序。我怎样才能做到这一点?
例如{a..c}{1..3}
扩展为a1 a2 a3 b1 b2 b3 c1 c2 c3
.
如果我想打印a1 b1 c1 a2 b2 c2 a3 b3 c3
,有没有类似的方法来做到这一点?最简单的方法是什么?
有没有办法通过变量重定向 stdout 和 stderr,比如在脚本中添加命令选项?
例如我有一个脚本:
#!/bin/bash -x
TEST=">/dev/null 2>&1"
OPT='-p -v'
mkdir $OPT 123/123/123 $TEST
Run Code Online (Sandbox Code Playgroud)
我可以看到 OPT 被替换为-p
没有任何问题,bash 将其解释为选项。但重定向解释为目录名称。
$ ./test.sh
+ TEST='>/dev/null 2>&1'
+ OPT='-p -v'
+ mkdir -p -v 123/123/123 '>/dev/null' '2>&1'
mkdir: created directory `123/123'
mkdir: created directory `123/123/123'
mkdir: created directory `>/dev'
mkdir: created directory `>/dev/null'
mkdir: created directory `2>&1'
Run Code Online (Sandbox Code Playgroud)
有什么办法可以说 bash,$VAR 是重定向,而不是目录名称。
附注。可能是我走错了路,但我想从我的脚本中制作可选的详细或非详细输出。但是即使在非详细模式下我也需要一些输出,因此我不能只重定向整个 stdout 和 stderr,只能从脚本中的某些命令重定向。
这个:
$ echo {{a..c},{1..3}}
Run Code Online (Sandbox Code Playgroud)
产生这个:
a b c 1 2 3
Run Code Online (Sandbox Code Playgroud)
这很好,但很难解释
$ echo {a..c},{1..3}
Run Code Online (Sandbox Code Playgroud)
给
a,1 a,2 a,3 b,1 b,2 b,3 c,1 c,2 c,3
Run Code Online (Sandbox Code Playgroud)
这是在某处记录的吗?该猛砸参考并没有提到它(即使它有使用它的例子)。
作为man mkdir
状态
-p, --parents
no error if existing, make parent directories as needed
Run Code Online (Sandbox Code Playgroud)
当我运行此命令时
mkdir -p work/{F1,F2,F3}/{temp1,temp2}
Run Code Online (Sandbox Code Playgroud)
它创建了一个文件夹结构,这样的work
父文件夹,然后F1
,F2
,F3
子文件夹和temp1
以及temp2
在三个父文件夹的子文件夹F1
,F2
,F3
。
work
-F1
-temp1
-temp2
-F2
-temp1
-temp2
-F3
-temp1
-temp2
Run Code Online (Sandbox Code Playgroud)
现在的问题是我想创建temp1
,temp2
文件夹,只在和F1
下,但我对如何编写命令来做我想做的事情感到困惑。F2
F3
通过 echo 时上述命令的输出是:
# echo systemctl\ {restart,status}\ sshd\;
systemctl restart sshd; systemctl status sshd;
Run Code Online (Sandbox Code Playgroud)
即使我将输出粘贴到终端,该命令也能工作。但是当我尝试直接运行命令时,我得到:
# systemctl\ {restart,status}\ sshd\;
bash: systemctl restart sshd;: command not found...
Run Code Online (Sandbox Code Playgroud)
我有两个问题..
brace-expansion ×10
bash ×7
shell ×3
arithmetic ×1
cat ×1
command-line ×1
files ×1
find ×1
ksh ×1
stdout ×1
zsh ×1