|
UNIX - zápočtové úlohy
Úloha č.13
Zadanie:
Soubor obsahuje určitý počet sloupců oddělených dvojtečkou.
Vypiš první a poslední a ověř, že všechny řádky obsahují stejný počet sloupců.
Vypiš chybu, pokud tomu tak není.
Testovat lze např. na /etc/passwd
a /etc/group .
Riešenie:
Program najprv prečíta riadok zo vstupu cez cyklus:
while read line;
Potom sa premenná line rozdelí do pozičných parametrov pomocou zmeny hodnoty IFS na dvojbodku. V podmienke sa zisťuje, či počet týchto parametrov sa zhoduje s predchádzajúcim počtom. Problémom bolo, že ak by bola dvojbodka na konci, tak by bol tento počet menší o jeden a už by to nesedelo. Tento problém je riešený tak, že zisťuje posledný znak riadku a zapíše ho do premennej posledny . Ak sa posledný znak zhoduje s dvojbodkou, tak sa tiež zväčší počet stĺpcov v aktúalnom riadku o jeden (počet stĺpcov vyjadruje premenná pocet ). Prvý a posledný stĺpec sa vypisujú pomocou pozičných parametrov. Posledný pozičný parameter sa vypíše pomocou príkazu shift , ktorý posunie tento posledný parameter na prvú pozíciu.
Skript aj s poznámkami vyzerá takto:
#!/bin/bash
OIFS=$IFS #ulozenie povodnej hodnoty IFS
pocet=-1; #hodnota poctu stlpcov, ked este neprecitalo prvy riadok
while read line; #precita riadok
do
posledny="${line#${line%?}}"; #zisti posledny znak
IFS=:
set -- $line; #rozdeli riadok do pozicnych parametrov
IFS=$OIFS;
if [[ $posledny != ":" && $# -eq $pocet || $pocet -eq -1 || $posledny = ":" && $# -eq $(($pocet-1)) ]] ; #porovna pocet stlpcov s poctom z predchadzajuceho riadku
then
echo -n "$1:"; #vypise 1.parameter (hodnotu z prveho stlpca)
if [ $posledny = ":" ] ; then pocet=$(($#+1));
else pocet=$#; #zapise pocet stlpcov aktualneho riadka
fi
shift $(($pocet-1)); #posunie posledny parameter na polohu prveho
echo "$1"; #znovu vypise 1.parameter (ale teraz uz hodnotu z posledneho stlpca)
else
echo "V ďalšom riadku nie je rovnaký počet stĺpcov, program končí.";
exit 0;
fi
done;
IFS=$OIFS
Skript je dostupný aj z nasledovného linku: program13.sh
Úloha č.32
Zadanie:
Napiš v shellu skript problem32 , který reaguje standardním
způsobem na -h /--help
a -v /--version , při jakémkoli jiném argumentu
ohlásí
Bad argument!
a bez argumentů vypíše
Problem 32 solved!
Riešenie:
Riešením je porovnávanie 1. argumentu s definovanými výrazmi cez CASE:
case $1 in
"" ) echo "Problem 32 solved!";;
-v | --version ) echo "Verzia 1.0";;
-h | --help ) echo "Toto je program k úlohe č.32 k predmetu UNIX.";;
* ) echo "Bad argument!"
esac
,kde "" znamená, že tam nie je argument a * vyjadruhe všetky iné možné argumenty.
Skript je dostupný aj z nasledovného linku: problem32.sh
|
Dátum |
19.04.2025 |
 |
Tvoja IP |
3.15.14.230 |
 |
Počet návštev |
2429 |
|
|