Wpis z mikrobloga

#!/bin/bash

LOCATION=~/test/
DATE=$(date +'%d-%m_%H:%M')
FILENAME=Screenshot+$DATE
LASTNUMBER=XX
FILENAME=dupa

MAX () {
if [ $1 -gt $2 ]
then
echo $1
else
echo $2
fi
}

record=0

ls ${LOCATION} |
while read file;
do
# isolate number, from file name
number=${file:${#filename}}
number=${number::${#lastnumber}}
record=$(MAX $number $record)
echo "current record: $record"
done

echo "biggest number: $record"

output:
current record: 01
current record: 02
current record: 03
current record: 04
current record: 05
current record: 06
current record: 07
current record: 08
current record: 09
current record: 10
current record: 11
biggest number: 0

ktos mi powie co tu sie odwala?
Mam pliki w formacie:
dupa01.png
dupa02.png
.
.
.

i chce znaleść dupę z największym numerem na koncu
#programowanie #bash #linux #naukaprogramowania
  • 24
  • Odpowiedz
via Wykop Mobilny (Android)
  • 2
@RedveKoronny: pozatym zamiast pętli po ls lepiej robić mapfile i pętlę po liście

mapfile -t files < <(find "$location" -type file)
for file in "${files[@]}"; do
:
done
  • Odpowiedz
@RedveKoronny: zrobiłeś tam | (pipe), więc cała jego zawartość - u Ciebie pętla - została wykonana w podpowłoce i tam zmienna się zmieniała normalnie. Natomiast po "done" wylazłeś z tej powłoki, i tam zmienna record jest nieznana, stąd pokazuje się zero.
  • Odpowiedz
via Wykop Mobilny (Android)
  • 0
@RedveKoronny: A zamiast indeksować stringa dać regexam po liście

mapfile -t records < <(find "$location" -type f | grep -oP ".* dupa\K[0-9]+")
for x in "${records[@]}"; do
((x>record)) && record="$x"
done
  • Odpowiedz
via Wykop Mobilny (Android)
  • 2
@RedveKoronny: trzeba czytać dokumentujące, a nie sarkać, że coś jest głupie ( ͡° ͜ʖ ͡°)
W pipe każda komenda to inny proces i w zależności czy masz ustawiony lastpipe czy nie to albo pierwszą albo ostnia komenda w pipe będzie się wykonywać w pierwotnej powłoce.
  • Odpowiedz