Вы довольно близки. Как насчет:
### START CHECK
start_check_mtpt() {
local volume="$1"
local delay=5
local tries=$[ 60 / delay ]
local mounted=0
while [[ 0 = $mounted ]] && [[ $tries -ge 0 ]]; do
if cut -d' ' -f2 /etc/mtab | grep -qF "${volume}" ; then
mounted=1
# optional: break
else
sleep $delay
let tries=tries-1
fi
done
[[ 1 = $mounted ]]
return $?
}
### END CHECK
start_check "/media/MyMountName"
Поскольку вы ожидаете только (и предоставляете )три каталога перед параметром age, не зацикливайтесь без разбора; вместо этого зацикливайте явно:
for dir in 1 2 3; do
# work with "$1"
shift
done
или остановить зацикливание, когда останется один параметр:
while [ "$#" -gt 1 ]; do
echo "Work with $1"
shift;
done
Поскольку параметр «дни» меняется в течение каждой смены, вам нужно сначала его сохранить:
days=$4
... перед вызовом цикла.
... и если вы разрешите передавать произвольное количество каталогов:
[ "$#" -gt 1 ] || exit 1
days=${@: -1}
while [ "$#" -gt 1 ]; do
echo work with "$1" and "$days"
shift
done
Это использует массив bash $@
и запрашивает последний его элемент (, обозначенный -1
, разделенный пробелом, чтобы предотвратить его интерпретацию как модификатор:
); затем он перебирает параметры один за другим, пока не останется один (начальный параметр «день» в конце ).
Просто измените (( $# ))
на(( $# > 1))
:
while (( $# > 1 )); do
echo "file is: $1"
done
echo "days are: $1"
Пара решений.
Выберите последний аргумент командной строки.
args=( "$@" )
num=${args[-1]}
args=( "${args[@]:0:${#args[@]} - 1}" )
(затем используйте find "${args[@]}" -type f -mtime "+$num" -print -delete
для удаления этих файлов ).
Сначала поставьте число.
num=$1; shift
(, затем используйте find "$@" -type f -mtime "+$num" -print -delete
для удаления файлов ).
Цикл нужен только в том случае, если у вас есть сотни или тысячи каталогов для обработки, и в этом случае команда find
будет слишком длинной при одном вызове. В противном случае не зацикливайтесь. find
может использовать несколько путей поиска.
Если вы хотите вставить задержку и явно использовать rm
и иметь форматированный вывод для каждого файла:
find "$@" -type f -mtime "+$num" -exec sh -c '
for pathname do
printf "Removing %s\n" "$pathname"
rm -- "$pathname"
sleep 1
done' sh {} +
Если вы обнаружите, что вам действительно нужно перебирать каталоги (или если вам так удобнее):
# Assumes that the arguments are in the order
# num dir1 dir2 dir3...
num=$1
shift
for dir do
printf 'Processing %s...\n' "$dir"
find "$dir" -type f -mtime "+$num" -exec sh -c '
for pathname do
printf "Removing %s\n" "$pathname"
rm -- "$pathname"
sleep 1
done' sh {} +
done
или,
# Assumes that the arguments are in the order
# dir1 dir2 dir3... num
args=( "$@" )
num=${args[-1]}
args=( "${args[@]:0:${#args[@]} - 1}" )
for dir in "${args[@]}"; do
# as above
done