Давайте посмотрим, как расширяются ваши переменные.Вы устанавливаете:
date="*-05-*_state.txt *-06-*_state.txt"
И затем вы устанавливаете $statefile
с выводом команды:
ls ${states_path}/*-05-*_state.txt *-06-*_state.txt| shuf -n 1
Теперь вы видите проблему?
А лучшеЧтобы справиться с этим, можно использовать массив для хранения шаблонов и другой массив для сбора имен файлов, поскольку синтаксический анализ ls проблематичен :
#!/usr/bin/env bash
states_path=./daily_states/
patterns=("*-05-*_state.txt" "*-06-*_state.txt")
a=() # initialize an empty array
shopt -s nullglob # if no expansion occurs, expand to null
# Step through your patterns...
for monthpat in "${patterns[@]}"; do
# And add files matching the pattern to the array.
a+=( $states_path/$monthpat )
done
# Print the list
declare -p a
# or if you prefer,
printf '%s\n' "${a[@]}"
# Or just print one random entry:
printf 'random: %s\n' "${a[ $(( $RANDOM % ${#a[@]} )) ]}"
Обратите внимание, что я не использую shuf
, поскольку он не является частью bash и недоступен в операционных системах. Я использую bash (FreeBSD и macOS).
Если вы ЗНАЕТЕ, что вас интересует только эти два месяцафайлы, вы можете выразить их как один глобус.Таким образом:
a=( $states_path/*-0[56]-*_state.txt )
printf '%s\n' "${a[$(($RANDOM%${#a[@]}))]}"