Cílem je zopakování jednoduchých příkazů a vyzkoušení si důsledků interpretace příkazové řádky.
Základy
Na standardní výstup vypište přesně, jak je zadáno:
Tento retezec obsahuje 7 mezer.
SP # Shell Prakticky
$SP$
`SP'
"SP"
'SP'
`\$/'
"$PATH"
~printf '%s\n' 'Tento retezec obashuje 7 mezer.' \
'SP # Shell Prakticky' '$SP$' '`SP'\' '"SP"' "'SP'" '`\$/'\' \
'"$PATH"'
Vypište počet aktuálně přihlášených uživatelů, zarovnaný mezerami zleva na 79 znaků.
~printf '%79d\n' $( who | wc -l )
Vypište počet aktuálně přihlášených uživatelů tak, aby číslo bylo zleva doplněno nulami na 10 číslic.
~printf '%010d\n' $( who | wc -l )
Vypište text Casova znacka: YYYYMMDD-hhmm
, podle aktuálního data a času.
~printf 'Casova znacka: %s\n' "$( date +%Y%m%d-%H%M )"
~date +'Casova znacka: %Y%m%d-%H%M'
Znovu vypište text Casova znacka: YYYYMMDD-hhmm
, podle aktuálního data a času.
~printf 'Casova znacka: %s\n' "$( date +%Y%m%d-%H%M )"
~!!
Do proměnné D
uložte aktuální datum ve formátu YYMMDD
. Vytvořte adresář backup_YYMMDD
, kde YYMMDD
je z proměnné D
. Zobrazte podrobnosti vytvořeného adresáře a poté jej smažte.
~D=$( date +%y%m%d )
~mkdir "backup_$D"
~ls -ld "backup_$D"
~rmdir "backup_$D"
V předchozím příkladu uložte řetězec backup
do proměnné B
a použijte ji.
~B=backup
~D=$( date +%y%m%d )
~DIR=${B}_$D
~mkdir "$DIR"
~ls -ld "$DIR"
~rmdir "$DIR"
Podle aktuálního data vytvořte adresář YYYY
a v něm adresář MM
. V tomto adresáři vytvořte soubor DD.txt
, který bude obsahovat aktuální čas.
~YM=$( date +%Y/%m )
~D=$( date +%d )
~mkdir -p "$YM"
~date +%T > "$YM/$D.txt"
V adresáři podle předchozího příkazu vytvořte další, prázdné, soubory od 01.txt až po 31.txt.
~touch "$YM"/{01..31}.txt
Zobrazte všechna jména souborů v aktuálním adresáři, která obsahují řetězec uložený v proměnné FRAGMENT
. (Před i za tedy může být libovolný počet znaků.
~ls *"$FRAGMENT"*
~printf '%s\n' *"$FRAGMENT"*
Vypište všechny jména souborů v adresáři /bin
, které:
~cd /bin
~ls -d ??? #1
~ls -d ???* #2
~ls -d ? ?? ??? #3
~ls -d [a-z]? #4
~ls -d [[:lower:]]?
~ls -d [^a-z]? #5
~ls -d [^[:lower:]]?
~ls -d *[0-9]* #6
~ls -d *[[:digit:]]*
~ls -d [0-9]? ?[0-9] #7
~ls -d [[:digit:]]? ?[[:digit:]]
~ls -d *[^a-zA-Z0-9]* #8
~ls -d *[^[:alnum:]]*
~ls -d */ #9
Vypište podrobný seznam všech adresářů (jako položky) uvedených v proměnné PATH
.
~oldIFS=$IFS; IFS=:; ls -ld $PATH; IFS=$oldIFS
Vypište podrobný seznam všech položek adresářů uvedených v proměnné PATH
.
~oldIFS=$IFS; IFS=:; ls -l $PATH; IFS=$oldIFS
V proměnné SERVER
je uložen řetězec (např. localhost) a v proměnné USER
jiný řetězec (např. osboxes). Zkopírujte všechny soubory z aktuálního adresáře, včetně případných podadresářů, na vzdálený počítač daný hodnotou proměnné SERVER
do domovského adresáře uživatele jako uživatel podle hodnotoy proměnné USER
.
~scp -r * "$USER@$SERVER:"
Zkopírujte všechny soubory, jejichž jméno končí na .pdf
v aktuálním adresáři na vzdálený počítač localhost
do stejného adresáře, jako je současný aktuální adresář (předpokládejte, že existuje).
~scp *.pdf localhost:"$PWD"
Aritmetika
Vytvořte soubor s1
, který bude obsahovat 10 řádek s čísly od 1
do 10
.
~printf '%d\n' {1..10} >s1
Vytvořte soubor s2
, který bude obsahovat 26 řádek s písmeny od a
do z
.
~printf '%s\n' {a..z} >s2
Do proměnné l1
uložte počet řádek souboru s1
a do proměnné l2
uložte počet řádek souboru s2
.
~l1=$( wc -l <s1 )
~l2=$( wc -l <s2 )
Do proměnné sum
uložte součet počtu řádků souborů s1
a s2
.
~(( sum = l1 + l2 ))
Pokud je v proměnné sum
hodnota 36
, vypište text: OK
.
~(( sum == 36 )) && echo OK
Kostky
Existuje proměnná RANDOM
, která obsahuje náhodné číslo. Pokud je toto číslo sudé, vypište řetězec SUDA
, pokud je liché, vypište řetězec LICHA
.
~sl=SUDA; (( RANDOM % 2 )) && sl=LICHA; echo "$sl"
V předchozím příkladu vypište před řetězec i porovnávanou hodnotu.
~sl=SUDA; (( R = RANDOM, R % 2 )) && sl=LICHA; echo "$R $sl"
Vytvořte alias dice
, který vypíše náhodně číslo od 1 do 6. Alias zavolejte a vypište.
~alias dice='echo $(( RANDOM % 6 + 1 ))'
~dice
~alias dice
Vytvořte alias roll
, který hodí 3x kostkou a vypíše součet hodů.
~alias roll='echo $(( $(dice) + $(dice) + $(dice) ))'
Upravte předchozí alias roll tak, aby zobrazil také mezivýsledky, např.: 2 + 6 + 1 = 9
~alias roll='(( a=$(dice), b=$(dice), c=$(dice), s=a+b+c ))
echo $a + $b + $c = $s'
Karty
Vypište znak s Unicode U+2665
.
~echo $'\u2665'
Vypište znaky s Unicode U+2660
, U+2665
, U+2666
, U+2663
, U+2664
, U+2661
, U+2662
, U+2667
.
~echo $'\u2660' $'\u2665' $'\u2666' $'\u2663' $'\u2664'\
$'\u2661' $'\u2662' $'\u2667'
Vypište všechny karty, tedy hodnoty od 2
do 10
, J
, Q
, K
a A
.
~echo {{2..10},J,Q,K,A}\
{$'\u2660',$'\u2665',$'\u2666',$'\u2663',$'\u2664',\
$'\u2661',$'\u2662',$'\u2667'}
Spočítejte počet karet.
~printf '%s\n' {{2..10},J,Q,K,A}\
{$'\u2660',$'\u2665',$'\u2666',$'\u2663',$'\u2664',\
$'\u2661',$'\u2662',$'\u2667'}\
| wc -l
Vypište karty všechny karty tak, aby každá karta zabírala stejný počet znaků.
Pozor, některé znaky mohou být na více bajtů.
~printf '%5s' {{2..10},J,Q,K,A}\
{$'\u2660',$'\u2665',$'\u2666',$'\u2663',$'\u2664',\
$'\u2661',$'\u2662',$'\u2667'}
Řádky z předchozího příkladu uložte do proměnné cards
.
~cards=$( printf '%5s' {{2..10},J,Q,K,A}\
{$'\u2660',$'\u2665',$'\u2666',$'\u2663',$'\u2664',\
$'\u2661',$'\u2662',$'\u2667'} )
#nebo lépe
~printf -v cards '%5s' {{2..10},J,Q,K,A}\
{$'\u2660',$'\u2665',$'\u2666',$'\u2663',$'\u2664',\
$'\u2661',$'\u2662',$'\u2667'}
Z proměnné je možné vypsat podřetězec pomocí syntaxe ${prom:start:len}
, kde prom
je jméno proměnné, start
je výchozí pozice číslovaná od 0
a len
je délka podřetězce. Vypište náhodnou kartu.
~echo "${cards:$(( RANDOM % 104 * 3)):3}"
Vytvořte alias card
, který výpíše náhodnou kartu.
~alias card='echo "${cards:$((RANDOM % 104 * 3)):3}"'
Vytvořte alias gcard, který zobrazí grafickou podobu náhodné karty ve tvaru:
.----.
| |
| |
| Q♤|
'----'
~alias gcard="printf '.----.\n| |\n| |\n| %s|\n'\'"\
"----'\''\n' \"\$(card)\""
Příkaz column
dokáže vytvořit sloupce textu o zadané šířce. Uložte do souboru hand
pět karet zasebou. Pomocí příkazu column
vypište karty vedle sebe.
~gcard >hand
~gcard >>hand
~gcard >>hand
~gcard >>hand
~gcard >>hand
~column -c 40 hand
Z předchozího příkladu vytvořte alias give
, který rozdá 5 náhodných karet.
.----. .----. .----. .----. .----.
| | | | | | | | | |
| | | | | | | | | |
| J♠| | 3♤| | 5♣| | K♧| | 7♦|
'----' '----' '----' '----' '----'
~alias give='gcard >hand; gcard >>hand; gcard >>hand;
~gcard >>hand; gcard >>hand; column -c 40 hand'