Variable zerlegen sh zsh awk sed?

cat1510

Well-Known Member
Hi Leutz,

ich habe eine Variable:

x=1,23,43,53,85,134

zum Beispiel.

Wie kann ich die einzelnen unregelmaessigen Werte von einer Schleife auf Wahrheit pruefen lassen?

if $x = 85 Then
echo "85 stimmt uerbein."
fi

Ich habe mit awk folgendes 'ausbaldovert':

echo $x | awk 'BEGIN{FS=",";}{ for (i = 1; i <= NF; i++) print $i," ";}'

Das schreibt zumindest schonmal alle Zahlen nacheinander.
Bin ich mit awk auf dem Holzweg oder kann das die Shell direkt selbst machen?
Script laeuft in der z-shell.

Ok das klingt wohl ein bisschen wild.
Ich will in einer 'settings' Datei einer Variable willkuerliche Werte geben.
Testet eine Schleife die Variable ab, wird sie zerlegt in die einzelnen Zahlen und dann getest, ob Sie in der Bedingung vorkommt.

Hab Ihr eine Idee?

MFG


CAT
 
eigentlich gibts glaub tausend wege sowas zu machen:

Code:
for i in `echo $x | tr ',' '\n'
do
     echo $i
done


Code:
echo $x | tr ',' '\n' | while read f1 rest
do 
     echo $f1
done

ich liebe zsh, flexibel, vielseitig, stabil, kurz: maechtig.
 
aha, .. naja, .. visual basic isses aber auch nich grad oder ? =)

*renn*

bzw. zeig ma was, ..
 
Zuletzt bearbeitet:
Hmm ich muss mal nochwas fragen zur zsh. :o)

Frohes Neues 2013 zuerst!

Script:
Code:
#!/bin/zsh
set -x
array1=("root test1 host1" "root test2 host2")

for ((m=1; m < ${#array1}; m++)); do
  echo $array1[$m]
  /ein/befehl $array1[$m]
done

exit

Ausgbabe ist:
Code:
+./test.zsh:5> array1=( 'root test1 host1' 'root test2 host2' ) 
+./test.zsh:7> m=1
+./test.zsh:7> m < 2
+./test.zsh:8> echo 'root test1 host1'
root test1 host1
/ein/befehl [COLOR="Red"][SIZE="4"]'[/SIZE][/COLOR]root test1 host1[COLOR="Red"][SIZE="4"]'[/SIZE][/COLOR]
+./test.zsh:7> m++
+./test.zsh:7> m < 2
+./test.zsh:11> exit

So kann ich natuerlich mit ' die naechsten Befehle nicht weiterverarbeiten.
Daher meine Frage: Wie bekomme ich die ' weg? :confused:
Kann man in einem array den IFS aendern?
Hat mit meinen Ideen zumindest nicht funktioniert.

CAT
 
hey cat,

ich bin mir zwar nicht sicher was du erreichen willst, aber die ' werden nur durch -x dargestellt, warum nimmst du keine foreach schleife ?

Code:
#!/bin/zsh
#set -x
array1=("root test1 host1" "root test2 host2")

IFS=";"
count=0
for i in $array1
do
	count=$(($count+1))
	echo "$i"
	/ein/befehl "$i"
done
unset IFS

exit

VG, Marco
 
Hi Marco,

in dem speziellen Fall geht es um einen Raid Status, der von einem Adaptec Controller ausgelesen werden soll.

das Programm ./arcconf muss mit Parametern gestartet werden.
Das geht aber nicht, weil:

Code:
./arcconf SETVMCREDENTIAL 'host 5989 root Passwd'
Invalid arguments.

 Usage: SETVMCREDENTIAL <ESXIP> <ESXCIMOMPORT> <ESXUSERID> <ESXPASSWORD> [noprompt]

Er nimmt immer die ' Ticks mit.
Verdammte Axt! :mad:

Daran haengt es.


Warum setzt Du denn den Field Separator? Wird der denn benutzt?
 
hey cat,

probiers mal damit:
Code:
#!/bin/zsh
#set -x
array1=("root test1 host1" "root test2 host2")

count=0
for i in $array1
do
        echo $i | while read f1 f2 f3 rest
        do
                echo "./arcconf SETVMCREDENTIAL $f1 $f2 $f3"
        done
done

exit

den IFS musst tatsaechlich nicht setzen ;)
 
Cool hat funktioniert!
Hab es fuer mein Script angepasst.
Vielen Dank fuer die Idee.

Du zerlegst mit read den kompletten Wert in einzelne Variablen, die mit <Space> getrennt sind. Hier koennte man auch theoretisch einen anderen IFS setzen.
Ein bisschen kommt mir das trotzdem wie 'von hinten durch die kalte Kueche ins Auge' vor...
Warum ist das denn so kompliziert....?

Egal, rennt ja.
Nochmal danke.


CAT
 
hey Cat,

naja, ich denke die komplexitaet gibst du schon selbst mit dem array vor, wenn du hier vielleicht einen geschickteren ansatz machst, brauchst diese foreach/while read kombi nicht.
 
Ich habs mal so gemacht...

Code:
bash-2.03$ x="1,23,43,53,85,134"; for i in $(echo ${x} | tr "," "\n" );do if [ ${i} -eq "85" ] ; then echo "${i} is equal 85"; else echo "${i} is not equal 85";fi ;done;
1 is not equal 85
23 is not equal 85
43 is not equal 85
53 is not equal 85
85 is equal 85
134 is not equal 85

Das geht aber 100% einfacher/besser/sauberer :cool:

zsh hab ich hier grad nicht zu hand, müsste aber imo auch gehen....

Hmmm....habe jetzt eine zsh gefunden und dein Skript ausprobiert....müsste doch funktionieren....

Code:
~/evgenij% ./cat1510.sh
root test1 host1
/bin/befehl root test1 host1

~/evgenij% cut cat1510.sh
#!/bin/zsh
array1=("root test1 host1" "root test2 host2")

for ((m=1; m < ${#array1}; m++)); do
  echo $array1[$m]
  [B][COLOR="Red"]echo "/bin/befehl $array1[$m]"[/COLOR][/B]
done

exit

Bist du dir sicher dass dein Problem an den '-Ticks liegt?
 
Zuletzt bearbeitet:
Macht es doch nicht so umständlich:
Code:
#! /bin/sh
set -eu

array="\
root test1 host1
root test2 host2"

echo "$array" | while read -r user passwd host; do
  echo "$user $passwd $host"
  /ein/befehl "$user" "$passwd" "$host"
done
 
Zurück
Oben