当变量给出范围时,如何在Bash中迭代一系列数字?
我知道我可以这样做(在Bash 文档中称为"序列表达式" ):
for i in {1..5}; do echo $i; done
Run Code Online (Sandbox Code Playgroud)
这使:
1
2
3
4
5
但是,如何用变量替换任何一个范围端点?这不起作用:
END=5
for i in {1..$END}; do echo $i; done
Run Code Online (Sandbox Code Playgroud)
哪个印刷品:
{} 1..5
有可能做这样的事情:
start=1
end=10
echo {$start..$end}
# Ouput: {1..10}
# Expected: 1 2 3 ... 10 (echo {1..10})
Run Code Online (Sandbox Code Playgroud) 当seq数是变量时,我在Bash中遇到内置序列(即:不使用seq)的问题.例如,这工作并打印我1 2 3:
for i in {1..3};do echo $i;done
Run Code Online (Sandbox Code Playgroud)
但是这个 :
bash-3.2 $ a = 3;对于i在{1 .. $ a};做回声$ i;完成
失败并仅打印我{1..3}
这适用于ZSH,我知道我有一个替代方案来制作一个反制品,但想知道这是一个bug还是大括号扩展功能!
我试图匹配并循环扩展.txt .h .py文件.在特定文件夹$ {arg}中.这就是我做的
for file in ${arg}/*.{txt, h, py}; do
...
done
Run Code Online (Sandbox Code Playgroud)
但是,即使我有这样的文件,我的所有扩展都没有这样的文件.
line 24: dir1/*.{txt,: No such file or directory
line 24: h,: No such file or directory
line 24: py}: No such file or directory
Run Code Online (Sandbox Code Playgroud)
如何循环使用指定扩展名的文件for?
我有四个文件:
1.txt 2.txt 3.txt 4.txt
Run Code Online (Sandbox Code Playgroud)
在linux shell中,我可以使用:
ls {1..4}.txt 列出所有四个文件,但是如果我设置两个变量:var1 = 1和var2 = 4,如何列出这四个文件?那是:
var1=1
var2=4
ls {$var1..$var2}.txt # error
Run Code Online (Sandbox Code Playgroud)
什么是正确的代码?
$ set a b c
$ echo $1 $2 $3
a b c
$ echo ${1..3}
-bash: ${1..3}: bad substitution
Run Code Online (Sandbox Code Playgroud)
我希望通过支撑扩展来回收$ 1 $ 2 $ 3.但它不起作用.
扩展的顺序是:括号扩展,波浪扩展,参数,变量和算术扩展和命令替换(以从左到右的方式完成),单词拆分和路径名扩展.
根据bash手册,在参数扩展之前执行支撑扩展.
所以我认为bash应首先执行大括号扩展${1..3},将其转换为echo $1 $2 $3,然后执行参数扩展.
然而,事实是bash抱怨${1..3}是一个糟糕的替代品.这是为什么?
PS:谢谢你们!你们的回答都很精彩.但我想
Ignacio Vazquez-Abrams的答案更接近我想要的.
我正在尝试以下命令:
ls myfile.h1.{`seq -s ',' 3501 3511`}*
Run Code Online (Sandbox Code Playgroud)
但ls提出错误:
ls: cannot access myfile.h1.{3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511}*: No such file or directory
Run Code Online (Sandbox Code Playgroud)
似乎ls认为整行是文件名而不是通配符模式.但是,如果我只是ls myfile.h1.{3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511}*在终端中复制该命令,我会按预期获得列表.
为什么要在完整的工作中键入命令,而不是使用seq?
请考虑以下脚本:
#! /bin/bash -e
echo {foo,bar}
EX={foo,bar}
echo ${EX}
Run Code Online (Sandbox Code Playgroud)
该脚本的输出是:
foo bar
{foo,bar}
Run Code Online (Sandbox Code Playgroud)
我echo想要执行大括号扩展的命令${EX}.因此,我希望看到一个输出
foo bar
foo bar
Run Code Online (Sandbox Code Playgroud)
我想创建一个脚本,用户可以在其中提供带有大括号的路径,其中复制了每个扩展版本.
像这样的东西:
#! /bin/bash -e
$SOURCES=$1
$TARGET=$2
cp -r ${SOURCES} ${TARGET}
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?