lrwxrwxrwx 1 deploy users 20 1? 23 18:15 v122 -> /home/files/video122
lrwxrwxrwx 1 deploy users 20 1? 23 18:15 v123 -> /home/files/video123
lrwxrwxrwx 1 deploy users 20 1? 23 18:15 v124 -> /home/files/video124
lrwxrwxrwx 1 deploy users 20 1? 23 18:15 v125 -> /home/files/video125
lrwxrwxrwx 1 deploy users 20 1? 23 18:15 v126 -> /home/files/video126
lrwxrwxrwx 1 deploy users 20 1? 23 18:15 v127 -> /home/files/video127
lrwxrwxrwx 1 deploy users 20 1? 23 18:15 v128 -> /home/files/video128
lrwxrwxrwx 1 deploy …Run Code Online (Sandbox Code Playgroud) 我经常在命令行上使用大括号扩展,因为它很方便。
{foo,bar}
Run Code Online (Sandbox Code Playgroud)
扩展为:
foo bar
Run Code Online (Sandbox Code Playgroud)
多大括号扩展也扩展,例如:
{foo,bar}Q{foo,bar}
Run Code Online (Sandbox Code Playgroud)
将扩展为:
fooQfoo fooQbar barQfoo barQbar
Run Code Online (Sandbox Code Playgroud)
这是预期的行为,其中大括号扩展按顺序使用。
现在,我希望任何大括号扩展(或其他简短的命令行技巧)的输出为:
fooQfoo barQbar
Run Code Online (Sandbox Code Playgroud)
注意:我正在使用 bash 3.2
我正在寻找最简单的解决方案,将其$*作为输入,并扩展到以给定字符串为前缀和后缀的每个元素:
$*=foo bar baz
<solution(x,y)>=xfooy xbary xbazy
Run Code Online (Sandbox Code Playgroud)
我可以进行前置或附加,但不能同时进行:
echo ${*/#/x}
# prints xfoo xbar xbaz
Run Code Online (Sandbox Code Playgroud)
echo ${*/%/y}
# prints fooy bary bazy
Run Code Online (Sandbox Code Playgroud)
我无法结合这两种解决方案。该文档声称在 parameter=* 情况下扩展返回的值是一个列表,但我无法这样使用它。我想将生成的值数组作为单独的参数传递给另一个命令,因此简单地构建单个字符串是行不通的。
我期待大括号扩展适用于任意数量的参数。但是,对于 n=1,我得到以下信息:
$ find models/nsf-projects-{7}*
models/nsf-projects-{7}.rdf
Run Code Online (Sandbox Code Playgroud)
对于 n>1 扩展按预期发生,例如:
$ find models/nsf-projects-{6,7}*
find: ‘models/nsf-projects-6*’: No such file or directory
find: ‘models/nsf-projects-7*’: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我已经稍微浏览了 GNU 手册,但没有发现在任何地方明确声明 >1 个参数的要求。
问:n>1 确实是大括号扩展的要求吗?如果是这样,它为什么有用?
我想生成一些仅按年份不同的数组。在循环中,我创建了带有大括号扩展和变量的数组。
我尝试了以下代码但没有成功:
LIST={JF,JFE,RFS,JBF,JFI,JMCB}
for year in {1998..2000} {2009..2011}
do
declare -a 'y$year=('"$LIST"'-$year)'
echo "${y$year[@]}"
done
Run Code Online (Sandbox Code Playgroud)
结果应该是以下条目的列表:
y1998: JF-1998 JFE-1998 RFS-1998 JBF-1998 JFI-1998 JMCB-1998
y1999: JF-1999 JFE-1999 RFS-1999 JBF-1999 JFI-1999 JMCB-1999
...
y2011: JF-2011 JFE-2011 RFS-2011 JBF-2011 JFI-2011 JMCB-2011
Run Code Online (Sandbox Code Playgroud)
我不需要打印它们,只需在循环中使用它们并将它们作为参数传递即可。因为第二,eval在循环中是不够的。
for i in {1..40}
do
echo $i
done
Run Code Online (Sandbox Code Playgroud)
我有
{1..40}
Run Code Online (Sandbox Code Playgroud)
我想要一些类似的东西
1
2
3
and so on
Run Code Online (Sandbox Code Playgroud)
所以我可以i在命令的参数中使用变量。
如果匹配中存在重叠,大括号扩展可以产生文件名的多个实例。
一个简单的例子:
mkdir testdir; cd testdir
touch abcd
for f in *{b,c}*; do something_to "$f"; done
# or more simply:
ls -l *{b,c}*
Run Code Online (Sandbox Code Playgroud)
这是一个非常简化的示例,仅用于说明。在这种情况下,单个文件abcd将被处理(或列出)两次。
如何才能最好地消除此列表的重复数据?
bash/readline 是否有一个绑定或一个可以绑定组合键以扩展内嵌大括号的函数?类似于M-* key组合方式可用于内联通配扩展。
所以在执行组合键时
$ {a..z}
将变成:
$ a b c d e f g h i j k l m n o p q r s t u v w x y z
这是运行 Catalina 的 Mac 上的 bash:
这有效:
rsync -Pa --rsh="ssh -p 19991" --exclude '*.jpg' --exclude '*.mp4' pi@localhost:/home/pi/webcam /Volumes/Media/Webcam\ Backups/raspcondo/webcam/
Run Code Online (Sandbox Code Playgroud)
这些不:
rsync -Pa --rsh="ssh -p 19991" --exclude={'*.jpg', '*.mp4'} pi@localhost:/home/pi/webcam /Volumes/Media/Webcam\ Backups/raspcondo/webcam/
rsync -Pa --rsh="ssh -p 19991" --exclude {'*.jpg', '*.mp4'} pi@localhost:/home/pi/webcam /Volumes/Media/Webcam\ Backups/raspcondo/webcam/
Run Code Online (Sandbox Code Playgroud)
这是输出:
building file list ...
rsync: link_stat "/Users/mnewman/*.mp4}" failed: No such file or directory (2)
rsync: link_stat "/Users/mnewman/pi@localhost:/home/pi/webcam" failed: No such file or directory (2)
0 files to consider
sent 29 bytes received 20 bytes 98.00 bytes/sec
total size …Run Code Online (Sandbox Code Playgroud) 我想存储node1 node2 node3在一个变量中,以便它可以用作其他脚本的输入。
但是,我想通过使用 bash 给出的大括号扩展来做到这一点,如下所示:node{1..3}
我尝试使用一个变量nodes=node{1..3},但是当我将它用作脚本的参数 ( $nodes) 时,它会按字面意思拾取并且不会扩展。
brace-expansion ×10
bash ×8
array ×2
shell ×2
shell-script ×2
command-line ×1
readline ×1
rsync ×1
symlink ×1
wildcards ×1