我正在编写一个 shell 脚本,该脚本根据文件名创建文件列表,但我需要使用括号来使用指定范围。例如。
{30..35}
不知何故,shell 脚本不接受命令中的括号,作为我的脚本的示例:
InicialMin=$(date -d "-5 minutes" +%M)
FinalMin=$(date +%M)
MinRange="${MinInicial}..${MinFinal}" # Outputs for example 30..35
Results=$(ls -lrth /path/to/my/directory/SOMEFILES_20230922{$MinRange}.log | wc -l)
echo "Files found: ${Results}"
当我在shell中执行命令行时,它工作正常:
ls -lrth /path/to/my/directory/SOMEFILES_20230922{35..40}.log | wc -l
153
但是当我使用里面的命令执行我的shell脚本时,它说:
ls: cannot access /path/to/my/directory/SOMEFILES_20230922{35..40}.log: No such file or directory
我需要根据文件名进行列表,而不是根据修改时间(查找)。
我尝试了各种转义脚本中的“{}”字符,但没有成功。
有没有办法在shell脚本中执行以下命令?
ls -lrth /path/to/my/directory/SOMEFILES_20230922{$MinRange}.log
尝试:
Results=$(ls -lrth /path/to/my/directory/SOMEFILES_20230922\{$MinRange\}.log | wc -l)
Results=$(ls -lrth /path/to/my/directory/SOMEFILES_20230922'{'$MinRange'}'.log | wc -l)
Results=$(ls -lrth /path/to/my/directory/SOMEFILES_20230922{{$MinRange}}.log | wc -l)
回答你的问题:
是否可以在 shell 中执行以下命令 脚本?
ls -lrth /path/to/my/directory/SOMEFILES_20230922{$MinRange}.log
否,因为大括号扩展发生在变量扩展之前,因此您需要执行其他操作。
{35..40}
与
{${MinInicial}..${MinFinal}}
和
{$MinRange}
不同,所以说“当我在 shell 中执行命令行时,它工作正常”是错误的。我认为这三个表达式中只有第一个可以满足您的要求。首先尝试在 shell 中使用简单命令获取您想要的范围,例如
a=3; b=5; printf '%s\n' {$a..$b}
(这是行不通的,只是演示尝试使用变量与硬编码值(如范围内的
printf '%s\n' {3..5}
)的问题)。