Nach Variable fragen wenn die nicht als Parameter eingegeben wurde

satriani

satriani

SysLion
Hallo,

wie man aus dem Titel entnehmen kann, möchte ich dass man nach Argument gefragt wird, wenn man keinen eingetippt hat. zB
statt
#script -l /usr/home

und hier der Code:

Code:
#!/bin/sh

list_fu() {
          bu_response=$2
          if [ -z "$bu_response" ]; then
            read -r -p "Enter blabla: " bu_response
          fi

          for data in $bu_response
          do
            ...............
          done
}

backup_fu() {
          bu_response=$2
          if [ -z "$bu_response" ]; then
            read -r -p "Enter blabla: " bu_response
          fi

          for data in $bu_response
            do
              .............
          done
}

BU_RESPONSE=$2

if [ "$#" -lt "1" ]
then
	show_usage
	exit 1
fi

action="show_usage"

while [ "$#" -gt "0" ]
do
	case ${1} in
		-l|list)
			action="list_fu"
			shift
			;;
		-b)
			action="backup_fu"
			shift
			;;
	esac
done

case ${action} in
	list_fu)
                preparation
		list_fu $BU_RESPONSE
		;;
	backup_fu)
                preparation
		backup_fu $BU_RESPONSE
		;;
esac

exit 0

Wenn man kein Parameter definiert, dann fragt er danach, soweit so gut. Doch wenn man den bzw. die Parameter eintippt, dann passiert einfach nichts.
Ich sehe den Wald vor lauter Bäumen nicht :D

Danke im Voraus.
 
Du müsstest für jede Action eine flag einbauen, der angibt, ob die jeweilige Option spezifiziert wurde.
Am besten machst du das mit Boole'schen Werten, die du setzt, falls eine entsprechende Konfiguration gewählt oder abgewählt wurde.
Wenn du die Flags mit NULL initialisierst, kannst du auch noch prüfen, ob eine der beiden zuvorgenannten Optionen gewählt wurde.
Bsp:
Code:
#! /bin/bash

MACH_WAS=

while (( $# )); do
	case $1 in
		--mach-was)	MACH_WAS=true
		;;
		--mach-nichts)	MACH_WAS=false
	esac
	shift
done

if [ -z "$MACH_WAS" ]; then
	echo -n "Soll ich nun was machen oder nicht? [y/N]: "
	read SOLL_ICH_WAS_MACHEN
	shopt -s nocasematch
	case $SOLL_ICH_WAS_MACHEN in
		y|yes)	MACH_WAS=true
		;;
		*)	MACH_WAS=false
	esac
	shopt -u nocasematch
fi

if ( $MACH_WAS ); then
	echo "Ich mache dann mal was"
else
	echo "Ich mache dann mal nichts"
fi

Edit:
Ich sehe gerade, dass du den Funktionen list_fu und backup_fu jeweils $BU_RESPONSE als ersten Parameter übergibst, in den jeweiligen Funktionen, aber die Variable $bu_response auf den jeweils zweiten Parameter setzt. Ich nehme an, dass das nicht gewollt ist.
Warum definierst du überhaupt noch zwei zusätzliche Variablen $bu_response in den Funktionen, wenn du diese, wie dem Skript zu entnehmen ist ja nie belegst und den zweiten Parameter Ja schon in $BU_RESPONSE stehen hast.
Des weiteren würde das Skript wegen deinem while / case -Loop in eine Endlosschleife laufen, wenn man andere Parameter als -s, -list oder -b übergibt.
Vielleicht solltest du, bevor du programmierst, dir mal überlegen, was du überhaupt machen willst.

MfG

Schard
 
Zuletzt bearbeitet von einem Moderator:
Danke Schard, wie immer flott und hilfsbereit ;)
Aber, das ist ja eine ganz andere Struktur die du mir vorschlägst, außerdem kennt FreeBSD "shopt" gar nicht.

Ich sehe gerade, dass du den Funktionen list_fu und backup_fu jeweils $BU_RESPONSE als ersten Parameter übergibst, in den jeweiligen Funktionen, aber die Variable $bu_response auf den jeweils zweiten Parameter setzt. Ich nehme an, dass das nicht gewollt ist.
Warum definierst du überhaupt noch zwei zusätzliche Variablen $bu_response in den Funktionen, wenn du diese, wie dem Skript zu entnehmen ist ja nie belegst und den zweiten Parameter Ja schon in $BU_RESPONSE stehen hast.
Des weiteren würde das Skript wegen deinem while / case -Loop in eine Endlosschleife laufen, wenn man andere Parameter als -s, -list oder -b übergibt.
Vielleicht solltest du, bevor du programmierst, dir mal überlegen, was du überhaupt machen willst.

Also, ich muss ja eine Variable für die Schleife definieren und wenn man die nicht in Form eines Parameters eingibt, dann soll danach gefragt werden. Aber das ganze soll nach rechts verschoben werden, praktisch alles was nach
kommt, muss als $bu_response definiert werden.
 
Oha, also benutzt du FreeBSD und die olle Bourne shell? Na, gut! :D
Ich muss aber sagen, dass ich die genauen beschränkungen der Bourne Shell nicht kenne, da ich fast nur bash-Skripte erstelle.
Du musst es also eventuell anpassen.

Wenn ich dich richtig verstehe, soll entweder -l oder -b spezifiziert werden, und was jeweils danach kommt, die BU_RESPONSE sein.
Und falls nichts der beiden spezifiziert wird, soll nach der auszuführenden Operation gefragt werden.
Dann könnte das hier weiter helfen:

Code:
while [ "$#" -gt "0" ]
do
	case ${1} in
		-l|list)
			action="list_fu"
			shift
			BU_RESPONSE="$@"
			break
			;;
		-b)
			action="backup_fu"
			shift
			BU_RESPONSE="$@"
			break
			;;
		# Sonst...
		*)	echo -n "Please specify -l ot -b: "
			read ANSWER
			$0 $ASWER $@
	esac
done

Aber dann könntest du dir auch die Schleife sparen.
Erklär doch bitte mal, was du da eigentlich machen willst (s. mein erster Post).
 
Backup Script von ZFS Datasets, den man mit cron ausführen kann, etwa so
#script -b zroot/vsr zroot/tmp zroot/root
oder manuell
#script -b
#Folgende Datasets sind im Pool vorhanden:
#zroot/vsr
#zroot/tmp
#zroot/root
#zroot/usr
#Bitte wählen Sie Dataset(s) die gesichert werden soll(en):
#Ihre Wahl:_
-l ist zum auflisten der vorhandenen Backups und -r zum wiederherstellen. Das wars :)

Edit: OK, habs endlich hinbekommen. Danke Schard, du warst mir eine große Hilfe :respekt: :gn8:
 
Zuletzt bearbeitet:

Ähnliche Themen

script sshpass

Verschlüsseltes Backup-Script mit rsync

Crontab und Scripts - Problem

HandbrakeCLI Shell Skript

continue in Schleife einbauen

Zurück
Oben