HOME
Úvod. stránka
kontakt
FYZIKA
fyz. praktika
ASTRO
a. praktikum
fotky-Vyškov
METACENTRUM
zákl. príkazy
XSPEC
Chandra
XMM Newton
INFORMATIKA
UNIX
METEO
blesky
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