LX-SCR-INFO-substitution
updated 7/27/2010 00:55

substitution

  1. commandosubstitutie

    In bash kunnen we gebruik maken van command substitution. Een variabele kan dan gelijkgesteld worden aan de output van een commando. We kunnen die output ook gewoon in een string plaatsen.

    Er zijn twee syntaxmogelijkheden.

    (1) Traditioneel maken we gebruik van de backticks: de backtick staat op een be-azerty toetsenbord op de toets met het µ teken, uiterst rechts van de letter M; je moet <altgr> <µ> indrukken om hem op scherm te krijgen. (Op een us-qwerty toestsenbord staat de backtick gewoon naast het cijfer 1).

    $ echo date
    date
    $ echo `date`
    Tue Jun 29 14:12:44 CEST 2010

    $ var=`grep www-data /etc/passwd`
    $ echo $var
    www-data:x:33:33:www-data:/var/www:/bin/sh

    (2) Een tweede manier gebruikt het $-teken en haakjes, en is een klein beetje omslachtiger. Maar het dollarteken en de haakjes zijn makkelijker in te tikken, en zodra er substituties in substituties voorkomen (dat kan) wordt het ook al eenvoudiger:

    $ echo $(date)
    Tue Jun 29 14:19:20 CEST 2010

    $ var=$(grep www-data /etc/passwd)
    $ echo $var
    www-data:x:33:33:www-data:/var/www:/bin/sh

  2. voorbeeld

    #!/bin/bash
    #
    # ats: add time stamp wijzigt de naam van een file of een directory
    #      naar zichzelf met als extensie een timestamp
    #
    bestand=$1
    if [ ! -e "$bestand" ]
    then
    echo 'usage: $0 <filename>'
    echo 'file not found'
    else
    datum=`date +"%Y%m%d%H%M"`
    echo 'Timestamp: '$datum
    echo
    echo "now moving $bestand to $bestand.$datum"
    mv -v $bestand $bestand.$datum
    fi

    met als output:

    $ touch een_bestand

    $ ats een_bestand
    Timestamp: 201006291442

    now moving een_bestand to een_bestand.201006291442
    `een_bestand' -> `een_bestand.201006291442'


    $ ls een_bestand*
    een_bestand.201006291442

    $ ats
    usage: ats <filename>
    file not found



  3. oefeningen

    1. Schrijf een script dat zoekt welke dag van week we zijn (maandag tot zondag) en dit afdrukt in het nederlands.

    2. Wat doet volgend commando, ergens in een script:
      echo "` <$0`"
      Test dit met de vorige oefening.

    3. Schrijf een script dat test wie het script uitvoert; indien root het script uitvoert moet er een melding op scherm komen "het gebruik van dit script als root is te gevaarlijk", en moet het script stoppen. Indien een niet root gebruiker dit script uitvoert wordt alias rm="rm -f" toegevoegd aan zijn .bashrc