vis*_*isc 0 bash shell-script wildcards
我有这个工作命令行表达式:
program --files path_to_mydir/mydata_[0-9].csv
我想离开,[0-100]但这不起作用。
program --files path_to_mydir/mydata_[0-100].csv
另外,奖金问,你怎么称呼[0-10]wrt shell脚本和bash脚本?
谢谢
编辑:虽然类似这个问题不是问 ls
的[...]是括号表达式。它始终匹配单个字符,因此您不能使用[0-100]它,因为它只会匹配单个0或1(在 POSIX 语言环境中)
在zshshell 中,您可以使用<0-100>数字范围通配模式,但这在bash以下情况下不起作用:
program --files path_to_mydir/mydata_<0-100>.csv
Run Code Online (Sandbox Code Playgroud)
在 中bash,您可以改用大括号扩展:
program --files path_to_mydir/mydata_{0..100}.csv
Run Code Online (Sandbox Code Playgroud)
但是您必须注意这与文件名通配模式之间的区别。大括号扩展,就像上面的那个一样,生成字符串,不管有什么文件名可用,而文件名通配模式匹配现有的名称。这意味着大括号扩展可能会提供不存在的程序文件名。
您可以使用[...]0 到 100 之间的数字来匹配文件,但您必须将其设为三种模式,每个数字长度一种:
shopt -s nullglob
program --files \
path_to_mydir/mydata_[0-9].csv \
path_to_mydir/mydata_[1-9][0-9].csv \
path_to_mydir/mydata_[1][0][0].csv
Run Code Online (Sandbox Code Playgroud)
第一个匹配包含数字0到 to9的名字,第二个匹配包含10到 to的名字99,最后一个匹配包含100.
你想匹配零填充的整数:
shopt -s nullglob
program --files \
path_to_mydir/mydata_[0][0-9][0-9].csv \
path_to_mydir/mydata_[1][0][0].csv
Run Code Online (Sandbox Code Playgroud)
我nullglob在此代码的两个变体中都设置了shell 选项,以确保删除与任何名称不匹配的任何模式,而不是未展开。
用户 fra-san 注意到您可以将上面的括号扩展与强制 shell 触发通配模式匹配的东西结合使用:
shopt -s nullglob
program --files path_to_mydir/[m]ydata_{0..100}.csv
Run Code Online (Sandbox Code Playgroud)
包含[m]在字符串中(匹配字符的模式m)将强制 shell 将大括号扩展创建的每个字符串视为单独的通配符模式。由于我们正在使用nullglob,与现有名称不对应的模式将从参数列表中删除。
请注意,这将生成并扩展 101 个通配符模式,而在此答案中使用通配符的其他方法使用两个或三个模式。