我正在编写一个shell脚本,它可以迭代一些文件。
for f in $folder-*-something; do
echo $f
done一般情况下都可以,但我只想显示数字,所以我不想与$folder-1-2-something匹配
完全符合要求的事情就是
#!/usr/bin/env bash
shopt -s extglob
if [ $1 -eq 0 ]; then
for f in $folder-+([[:digit:]])-something; do
echo $f
done
fiextglob不能只在if-block中打开-它返回syntax error near unexpected token `(' (在某个地方,我读了一个简短的摘要为什么,但我找不到它了)。如果这是可行的,我可以在完成相关的行后reset it。
问题:我正在扩展的脚本是一个大型开源项目的一部分,我不想在整个>500行脚本中打开选项,因为这可能会干扰其他代码。
我现在倾向的选择是使用*-globbing并跳过不相关的条目。
shopt及其怪癖的好的深度信息?我发现很多网站都在谈论所有的选项,但我甚至找不到两行描述,说明为什么要把它直接放在shebang之后。发布于 2021-02-17 00:07:02
使用find而不是球形:
find . -regex "./$folder-[0-9]+-something" |
while IFS= read -r f; do
echo "$f"
done发布于 2021-02-16 23:57:45
解决方法之一是将匹配扩展模式的文件名存储到数组中,然后取消设置extglob。之后,必须使用数组,而不是扩展模式:
shopt -s extglob
files=("$folder"-+([[:digit:]])-something)
shopt -u extglob
if [ "$1" -eq 0 ]; then
for f in "${files[@]}"; do
echo "$f"
done
fi或者,如果您想恢复状态:
saved_state=$(shopt -p)
shopt -s extglob
files=("$folder"-+([[:digit:]])-something)
eval "$saved_state"https://stackoverflow.com/questions/66232378
复制相似问题