例子:
$ eval echo "{x,y,z}\ --opt\; "
x --opt; y --opt; z --opt;
假设第二个列表是{1,2,3}
并且它的长度等于第一个(初始)列表的长度。
问题:
- 制作方法
bash
:
x --opt 1; y --opt 2; z --opt 3;
- 如何
bash
制作(即从{x,y,z}
列表中引用元素):
x --opt x; y --opt y; z --opt z;
单线是优选的。
例子:
$ eval echo "{x,y,z}\ --opt\; "
x --opt; y --opt; z --opt;
假设第二个列表是{1,2,3}
并且它的长度等于第一个(初始)列表的长度。
问题:
bash
:x --opt 1; y --opt 2; z --opt 3;
bash
制作(即从{x,y,z}
列表中引用元素):x --opt x; y --opt y; z --opt z;
单线是优选的。
如果这个命令:
touch Test{1..3}.txt
允许我创建:
为了批量创建文件名中包含空格的文件,我需要什么语法?
例如:
显然,我可以使用引号单独创建带有空格的文件(见下文),但由于某种原因,使用大括号扩展时我似乎无法做同样的事情:
touch "Test 1.txt"
到目前为止,我已经尝试了以下但没有成功:
touch "Test {1..3}.txt"
我的语法有问题,还是大括号扩展无法做到这一点?
为什么大括号扩展与通配符结合的行为不同paste
?
示例:假设我们有多个文件夹,每个文件夹都包含相同结构的 tsv,并且想要创建一个包含每个文件夹的第 5 行的“all.tsv”。这两个命令的行为不同:
paste -d, <(cut -d$'\t' -f5 {test,test1,test2}/example.tsv) > all.tsv
对比
paste -d, <(cut -d$'\t' -f5 test*/example.tsv) > all.tsv
第一个按预期创建一个具有 3 列的 tsv,第二个创建一个单列 tsv,其值位于彼此下方。
我的问题是文件夹列表任意大,可能很长而且不连续。
有没有一种方法可以实现与使用通配符进行大括号扩展相同的行为,而无需移动到 bash 脚本并迭代文件夹?
使用 GNU bash
例如{a..c}{1..3}
扩展为a1 a2 a3 b1 b2 b3 c1 c2 c3
.
如果我想打印a1 b1 c1 a2 b2 c2 a3 b3 c3
,是否有类似的方法可以做到这一点?最简单的方法是什么?
a[bc]d
和 和有什么不一样a{b,c}d
?为什么人们a{b,c}d
在已经有的时候使用a[bc]d
?
为什么这有效:
mkdir /dir/test{1,2,3}
这不是吗?
{chown httpd,chmod 700} /dir/test1
-bash: {chown: command not found
我的 Bash 版本是:GNU bash,版本 4.2.46(2)-release
在 bash 中,大括号扩展发生在波浪号扩展之前。但是,波浪号前缀似乎在变量赋值之前扩展,而大括号扩展则没有。为什么?
bash 中的大括号扩展被记录为发生在波浪线扩展之前:
大括号扩展在任何其他扩展之前执行
据我了解,波浪号扩展发生在变量赋值之前,如下例所示:
# UNQUOTED TILDE PREFIX, TILDE EXPANSION EXPECTED
tilde=~
echo "$tilde"
# /Users/DeNovo
[[ $tilde == "$HOME" ]] && echo "literal match"
# literal match
# QUOTED TILDE PREFIX, TILDE EXPANSION DOES NOT OCCUR
lit_tilde='~'
echo "$lit_tilde"
# ~
# UNQUOTED TILDE PREFIX PRODUCED AND EVALUATED, TILDE EXPANSION OCCURS
# AS EXPECTED
eval echo "$lit_tilde"
# /Users/DeNovo
[[ $lit_tilde == "~" ]] && echo "literal match"
# literal match
这些例子似乎表明右操作数left=right
在被绑定为左操作数的值之前经历波浪号扩展。
然而,大括号扩展不会发生在变量赋值之前,其行为类似于将文字波浪号绑定到变量(相对于扩展的特殊字符/前缀)
# UNQUOTED BRACE, BUT NO EXPANSION. BRACE LITERAL IS PRESERVED
brace={a..c}
echo "$brace"
# {a..c}
[[ $brace = "a b c" ]] || echo "doesn't match"
# doesn't match
[[ $brace = "{a..c}" ]] && echo "literal match"
# literal match
# SIMILAR TO THE LITERAL TILDE, EVALUATING THE VARIABLE VALUE
# RESULTS IN BRACE EXPANSION
eval echo "$brace"
# a b c
将这两个扩展合并到一个示例中,您可以看到波浪号扩展发生而大括号扩展没有发生:
combined=~/dir_{a..c}
echo "$combined"
# /Users/DeNovo/dir_{a..c}
大括号防止内部代字号在分配期间扩展
internal_tilde={~,~+}/new_dir
echo "$internal_tilde"
# {~,~+}/new_dir
# vs the same output, not in a variable
echo {~,~+}/new_dir
/Users/DeNovo/new_dir /Your/Working/Directory/new_dir
只是为了澄清,我不是在问如何让变量包含大括号扩展的结果,而是为什么尽管发生在波浪线扩展之前,大括号扩展不会在变量赋值之前发生。有几种方法可以获得所需的行为。这是一个:
# PROCESS SUBSTITUTION GIVES THE DESIRED BEHAVIOR
brace_exp="$(echo {a..c})"
echo "$brace_exp"
a b c
[[ $brace_exp = "a b c" ]] && echo "literal match"
# literal match
再说一遍,为什么波浪号扩展发生在变量赋值之前,而大括号扩展(应该发生在波浪号扩展之前)却没有发生在变量赋值之前。大概分配在某种我不知道的方面是特殊的。
我正在运行 Debian 9。在 Bash 中,我可以echo {a..z}
使用字母表,或者echo {a..z}{a..z}
打印字母组合。但是,我想生成一个索引:a b c d
etc. then aa bb cc dd
etc. then aaa bbb ccc ddd
etc. 直到它是aaaaa bbbbb
(直到zzzzz
)。这怎么能用大括号扩展或其他类似方法来完成?谢谢
在 bash
echo {{a,b}.{c,d}}
中扩展为
{a.c} {a.d} {b.c} {b.d}
虽然在 bash 手册中没有提到我所做的输入类型的大括号扩展
我的问题是为什么输出不像这样ac ad bc bd