brainbaking/content/wiki/unix/cmd/bash.md

2.6 KiB

+++ title = "bash" draft = false tags = [ "unix", "cmd", "bash" ] date = "2013-03-12" +++

Bash Scripting

Rerun last command

!!

Joink.

bash opties uit een shell script halen

Gepikt van http://stackoverflow.com/questions/192249/how-do-i-parse-command-line-arguments-in-bash

#!/bin/bash
for i in $*
do
case $i in
    -p######*|--prefix*)
    PREFIX######`echo $i | sed 's/[-a-zA-Z0-9]*//'`

    ;;
    -s######*|--searchpath*)
    SEARCHPATH######`echo $i | sed 's/[-a-zA-Z0-9]*//'`
    ;;
    -l######*|--lib*)
    DIR######`echo $i | sed 's/[-a-zA-Z0-9]*//'`
    ;;
    --default)
    DEFAULT=YES
    ;;
    *)
            # unknown option
    ;;
esac
done
echo PREFIX = ${PREFIX}
echo SEARCH PATH = ${SEARCHPATH}
echo DIRS = ${DIR}

Makkelijker dan getopts()?

Pipen en multiple lines in shell scripts

Dit is legale shell code:

#!/bin/sh
cat dinges.log |
  cut -d ' ' -f 3
  grep 'Exception' |
  uniq

De pipe aan het begin van een nieuwe lijn alleszins niet. Ook >> of > kan niet het begin zijn van een nieuwe lijn, dan wordt een spatie gepiped naar de outputstream.

array loops

names=( Jennifer Tonya Anna Sadie )
for name in ${names[@]}
do
  echo $name
  # other stuff on $name
done

Ook mogelijk om bvb een counter bij te houden met for (( i = 0 ; i < ${#names[@]} ; i++ )). Array waarde accessen met ${names[$i]}.

Inline arrays "maken" en over lopen gaat met for VAR in 'a' 'b' 'c' do ... done.

argumenten samen rapen in een variabele
DIR_EXCLUDES=(eclipsecompiled test bin target)
FILE_EXCLUDES=(messages errors)

SEARCH=""

for FILE_EXCLUDE in ${FILE_EXCLUDES[@]}
do
	SEARCH="${SEARCH} -not -name *${FILE_EXCLUDE}*"
done
for DIR_EXCLUDE in ${DIR_EXCLUDES[@]}
do
	SEARCH="${SEARCH} -not -path *${DIR_EXCLUDE}*"
done

dit werkt niet als er een dubbele quote bij komt kijken in de vorm van <br/>" - vreemd? uit te zoeken...

Controleren of een string in een variabele steekt

Zie http://stackoverflow.com/questions/229551/string-contains-in-bash - makkelijkste manieren zijn

met grep
if grep -q '|' <<<$line; then
  echo "jup"
fi
met regexp
if [[ "$line" =~ "|" ]]; then
  echo "jup"
fi

Loopen over alle lijnen van bepaalde output voor verdere processing

`cat somefile` | while read line
do
  echo "lijn $line"
done

Dit kan ook maar dan moet je de separator variabele voor for aanpassen:

IFS=$'<br/>n'
for line in `cat somefile`
do
  echo "lijn $line"
done

By default splitst for op spaties