Проблема со смещением бэша

Вы довольно близки. Как насчет:

### 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"
2
20.12.2018, 21:08
3 ответа

Поскольку вы ожидаете только (и предоставляете )три каталога перед параметром 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, разделенный пробелом, чтобы предотвратить его интерпретацию как модификатор:); затем он перебирает параметры один за другим, пока не останется один (начальный параметр «день» в конце ).

3
27.01.2020, 21:51

Просто измените (( $# ))на(( $# > 1)):

while (( $# > 1 )); do
  echo "file is: $1"
done

echo "days are: $1"
0
27.01.2020, 21:51

Пара решений.

  1. Выберите последний аргумент командной строки.

    args=( "$@" )
    num=${args[-1]}
    args=( "${args[@]:0:${#args[@]} - 1}" )
    

    (затем используйте find "${args[@]}" -type f -mtime "+$num" -print -deleteдля удаления этих файлов ).

  2. Сначала поставьте число.

     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
5
27.01.2020, 21:51

Теги

Похожие вопросы