Shell-Skript: Optionaler Parameter

McAvatar

Admiral Special
Mitglied seit
11.08.2004
Beiträge
1.268
Renomée
8
Standort
Bielefeld, NRW
Hallo Leute, mal eine Frage zu Shell-Skripten:

Momentan lasse ich ein Skript mittels "$@" über alle angegeben Parameter - hier Dateinamen - laufen. Allerdings bietet es sich an, die Hamming-Distanz über einen optionalen Parameter variieren zu können. Wie würdet ihr vorgehen, wenn ein Parameter optional ist, während beliebig viele weitere Parameter folgen können?

Code:
#!/bin/bash

DEBUG='true' # Debug-Modus mit zusaetzlichen Log-Informationen an-/ausschalten
#VMATCHPATH=~/vmatch.distribution/

for file in "$@"
do
  startTime=$(date +%s)
  filesize=$(ls -l "${file}"| awk '{ print $5 }')
  MAXREPEATZAHL=268435456 # 2^28 = 256M
  SCALEBEGIN=16777216 # 2^24 = 16M
  HAMMINGDISTANCE=2
  LOGFILE="${file}".log
  ...
 
Stichwörter getopts und Parameter substitution. Damit kannst du auch dein Debug als optional verarzten. Ich hab getopts selber noch nicht verwendet. Bislang schreibe ich immer Konfigdateien, in denen die Einstellungen (optionale sind auch dort möglich) angegeben werden, die dann einfach gesourcet werden:
Code:
### Pfad und Name der Einstellungdatei
SETTINGSFILE=${0%.*}.conf

### Einstellungsdatei einlesen/sourcen, sofern vorhanden
[ ! -r "${SETTINGSFILE}" ] && { echo "Einstellungsdatei ${SETTINGSFILE} fehlt! Abbruch."; exit 1; }
. "${SETTINGSFILE}"

MfG Dalai
 
Zuletzt bearbeitet:
Gute Idee, funktioniert. :)
Code:
#!/bin/bash
NO_ARGS=0
USAGE="# Verwendung: `basename $0` [-l <Mindestrepeatlaenge>] <Dateiname(n)>"
minRepeatLength=0

# Mindestens ein Argument ist anzugeben.
if [ $# -eq "$NO_ARGS" ]
then
  echo $USAGE
  echo "# Mindestens ein Dateiname ist anzugeben, Wildcards wie '*' sind moeglich."
  exit
fi

while getopts "l:" options;
do
  case $options in
    l ) minRepeatLength=$OPTARG
	echo '# Beruecksichtige nur Repeats mit einer Laenge >= ' $minRepeatLength;;
   \? ) echo $USAGE
	exit 1;;
  esac
done

shift $((OPTIND-1))

startTime=$(date +%s)
for file in "$@"
 do
  LOGFILE="${file}".logfile
  ...
 
Zurück
Oben Unten