Szeretném megoldani ezt a feladványt. A hét napjait szeretném kiíratni megfelelő formában. Tehát számokat adok meg. Teszem azt 3, akkor szerda. Ha 2-5 akkor kedd-péntek. Ha 1,3,7, akkor hétfő, szerda, vasárnap.
Végül is majdnem jó amit csináltam, csak annyi a baj, hogy az utolsó nap után is kiírja vesszőt, vagy a kötőjelet. Persze ciklusban van. mi mást csinálna. A sed meg mindenhonnan leszedi az utolsó két karaktert, így lőttek az elválasztóknak.
#!/bin/bash
HN="$1"
# HN lehet: 1,2,7 # HN lehet: 2-5 # HN lehet: 3
dayS () {
case "${HNnum}" in
"1") HNw="Monday";;
"2") HNw="Tuesday";;
"3") HNw="Wednesday";;
"4") HNw="Thursday";;
"5") HNw="Friday";;
"6") HNw="Saturday";;
"7") HNw="Sunday";;
esac
}
separate=$(echo "${HN}" | cut -c2-2)
case "${separate}" in
"")
(( HNnum = HN ))
dayS
echo "${HNw}"
;;
"-" | ",")
mapfile numberArray <<< "$(echo "${HN}" | tr "${separate}" "\n")" # szétbontva tömbbe rakjuk az adatokat.
len=${#numberArray[@]} # itt megtudjuk hány számot is raktunk be.
for (( i=0; i<=$((len-1)); i++ )); do
(( HNnum = "${numberArray[$i]}" ))
dayS
printf '%s' "${HNw}${separate}" #| sed 's/..$//'
done
;;
esac
Persze ragoznám még, mert ha 6,7 akkor írja ki hogy hétvége. Ha 1-5, akkor hétköznap, meg lehetne páratlan napok, páros napok. Vagy teljesen más úton kéne elindulni? Hm. A beszúró ablakban a case-t még jól mutatta, de itt most nem.
- 287 megtekintés
Hozzászólások
Akkor tanulsz legtöbbet, ha magad találod ki, gondolkodsz rajta. Az ilyen problémára nagyon sokféle megoldás létezik, csak a fantázia szab határt annak, milyen adatstruktúrát, ábrázolási formát használsz, illetve milyen algoritmusokat. Én az egészet awk-ban írnám, de én ilyen vagyok. :)
Egyébként meg holnap ZH? :D
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Érdemben is mondok valamit. Lényegében egy teljes szintaxis elemzőt kell írnod. Kezdetben vesszőnél szeparálnék, erre az awk split() függvénye remek. Így megmaradnak egy elemként a kötőjeles dolgok, s ha ilyet találnék, azt külön kiértékelném.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
for i in $(echo $1 | tr "," " " ) :-D
- A hozzászóláshoz be kell jelentkezni
Igen, ezt is lehet, sőt, talán az IFS=',' is működne.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
#!/bin/bash
HN="$1"
days=("" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday" "Sunday")
IFS=$(echo "${HN}" | cut -c2-2)
read -a numberArray <<< $HN
j=${#numberArray[@]}
i=0
for val in "${numberArray[@]}";
do
((i++))
printf "${days[$val]}";
if [ "$i" -lt "$j" ]; then
printf "$IFS";
fi
done
printf "\n";
- A hozzászóláshoz be kell jelentkezni
Ha megírod helyette, soha nem tanul meg programozni.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Ha megérti amit írtam, már egy lépés a tanulásban.
- A hozzászóláshoz be kell jelentkezni
Áá. Igaz is két tömb. És az IFS mezőhatároló. A napok tömbbe rakásán én is gondolkoztam, de az IFS eszembe nem jutott volna. Mindenesetre köszi. Amúgy sosem tanultam iskolában programozni. Mindenre autodidakta módon és sok próbálkozással jöttem rá. Illetve voltak ilyen emberek akik kisegítettek. Nem ZH. Van egy szerelem projektem és most van időm kicsit kozmetikázni, finomítani.
- A hozzászóláshoz be kell jelentkezni
A paraméterből először a ","-ket cserélném " "-re, és egy ciklusban mennék végig rajtuk. Egy switch/case "keretén belül" ha az adott elem illeszkedik a "-" mintára, akkor az egy plusz ciklussal (for x in $(seq $(echo $a | tr "-" " "))) "váltanám át" számokká, illetve ez alapján írnám ki a megfelelő napot. Ha meg nem illeszkedik a "-" mintára, akkor a számnak megfelelő napot kell kiírni.
Hibakezelés, paraméter validálást és hasonlókat rád bízom :-P
- A hozzászóláshoz be kell jelentkezni
Csak nem hagyott nyugodni a dolog - lehet yool megköpködni :)
#!/bin/bash
nap=("vasárnap" "hétfő" "kedd" "szerda" "csütörtök" "péntek" "szombat" "vasárnap")
for i in $(echo $1 | tr "," " ")
do
case $i in
*-* ) for x in $(seq $(echo $i | tr "-" " "))
do
echo ${nap[$x]}
done ;;
* ) echo ${nap[$i]};;
esac;
done
A tömb 0. eleme azért a vasárnap, mert így a crontab "day of week" mezőjét pici kiegészítéssel (ott lehet névvel is hivatkozni a napokra) megeszi.
- A hozzászóláshoz be kell jelentkezni
$ echo 1,2-3/4=5%6#7 | sed -e 's/1/hétfő/g' -e 's/2/kedd/g' -e 's/3/szerda/g' -e 's/4/csütörtök/g' -e 's/5/péntek/g' -e 's/6/szombat/g' -e 's/7/vasárnap/g'
hétfő,kedd-szerda/csütörtök=péntek%szombat#vasárnap
- A hozzászóláshoz be kell jelentkezni
echo "2-4" | sed -e 's/1/hétfő/g' -e 's/2/kedd/g' -e 's/3/szerda/g' -e 's/4/csütörtök/g' -e 's/5/péntek/g' -e 's/6/szombat/g' -e 's/7/vasárnap/g'
kedd-csütörtök
A szerdát meg elvitte a cica... :-P
- A hozzászóláshoz be kell jelentkezni
Igazából nem gondoltam arra, hogy a szerdát is kiírja. Hiszen a hétfő-szombat rövidebb, mintha felsorolnám majdnem az egész hetet. A ragozáson már nem is gondolkoztam, mert az ugye... :)
fromDays=('Hétfőtől' 'Keddtől' 'Szerdától' 'Csütörtöktől' 'Péntektől' 'Szombattól' 'Vasárnaptól' )
toDays=('Hétfőn' 'Kedden' 'Szerdán' 'Csütörtökön' 'Pénteken' 'Szombaton' 'Vasárnap')
untilDays=('Hétfőig' 'Keddig' 'Szerdáig' 'Csütörtökig' 'Péntekig' 'Szombatig' 'Vasárnapig')
Ez sziszifuszi. De nyelvtanilag tuti hogy helyes lenne. :)
"4-6") echo ${fromDays[3]}-${untilDays[5]} ;;
A hétvége:
"6-7") echo "Hétvégén" ;;
"2,4,6") echo "Minden páros napon" ;;
"1,3,5") echo "Minden páratlan napon" ;;
"0") echo "Minden nap" ;;
*************************************
De most belém hasított a dilemma. Hétfőtől szerdáig az valójában 2 nap. De biztos hogy mindenki rávágja hogy 3. Ezért is hanyagolom a ragozást ebben az esetben.
- A hozzászóláshoz be kell jelentkezni
Akkor tényleg csak egy jól irányzott sed az egész :-)
- A hozzászóláshoz be kell jelentkezni
Eleve szarul van feltéve a kérdés, alulspecifikált. Amit a kérdésből és a példákból ki lehetett hámozni, azt a sed tudja a legegyszerűbben megoldani. Hogy mit kell kiírni pl. 11 string esetén, az meg kit érdekel, nem? :D
- A hozzászóláshoz be kell jelentkezni
Érdemes kettéválasztani a kérdést. Az első, a paraméterek egységesítése, tehát a felsorolások és az intervallumok egybegyúrása, azaz egy "1,2-3,5,6-7"-ból "1,2,3,5,6,7" sorozat megalkotása. Ezen végigmenve már tudsz olyat csinálni, ami egybegyúrja az intervallumokat (a a következő egyel nagyobb, mint az aktuális, akkor az intervallum végét növeled, ha egynél nagyobb a különbség, akkor az aktuális intervallumot kiírod, és a következőt megkezded, azaz a példában 1-3, majd 5-7 kerül kiírásra. De előtte vizsgálhatod azt is, hogy több napot jelölt-e meg, mint 3? Mer ha igen, akkor lehet, hogy célszerűbb a "melyik napon nem"-et kiírni :-)
Sokáig ragozható a dolog - kifejezetten ötletes feladatok alapja lehet shell script írása témakörben :-)
- A hozzászóláshoz be kell jelentkezni
Ez most csak találgatás, hogy vajon mire gondolhatott a posztoló.
Akkor már merjünk nagyot álmodni, írjunk programot, ami a napokra egy rímelő versikét is költ, mert hátha ez kell!
- A hozzászóláshoz be kell jelentkezni