ubuntuusers.de

Variable aus Scheleife return

Status: Ungelöst | Ubuntu-Version: Server 22.04 (Jammy Jellyfish)
Antworten |

Panzli

Anmeldungsdatum:
17. Dezember 2021

Beiträge: 19

Hallo zusammen, bei Folgenden Script würde ich gerne,dass die Variable aus der Schleife ausgeben ("returnt") wird, wie stelle ich dies am besten an?

Gebt mir gern noch weitere Verbesserungsvorschläge.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
device0="/dev/sda"
device1="/dev/sdb"
device2="/dev/sdc"
device3="/dev/sdd"
timeinput=""
time=""
os=$(lsblk |grep /boot/efi |grep -o sd.)
os="/dev/$os"

read -p "Wann sollen die Festplatten geshreddet werden (in Stunden)" timeinput
#echo $time
#time=$($timeinput*60)
#echo $time
time=$((timeinput * 3600))
sleep $time


for device in $device0 $device1 $device2 $device3 
do
if [ "$device" = "$os" ]
then
echo "skipped $os"  

device="notdelete"

echo "Wie bekomme ich das nach außerhalb der Schleife?"

#test="testinfunc"
fi	
echo $device
done


echo "Darunter sollte notdelete stehen..."
echo $device0
echo $device1
echo $device2
echo $device3

#sudo shred -v $device1 &sudo shred -v $device2 & sudo shred -v $device3 &

karzer Team-Icon

Wikiteam
Avatar von karzer

Anmeldungsdatum:
10. April 2022

Beiträge: 1479

Wohnort: Bad Oeynhausen

Hallo,

ich würde das so machen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
i=0
for device in device0 device1
do 
if [ "$device" = "$os" ];
then
echo "skipped $os"  
 
eval device$i="notdelete" 
i=$((i + 1)) 
done

echo "$device0" 
echo "$device1" 

# -> notdelete

fleet_street

Top-Wikiautor
Avatar von fleet_street

Anmeldungsdatum:
30. August 2016

Beiträge: 2400

Wohnort: Hunsrück (dunkle Seite)

Wieso muss das aus der Schleife raus? Damit man hinterher noch mal unterscheiden muss? Das wäre doch umständlich.

…
for device in $device0 $device1 $device2 $device3 
do
  if [ "$device" = "$os" ]
  then
    echo "skipped $os"  
    device="notdelete"
  else
    echo "Das gerät Gerät $device wird gelöscht"
    # Für den Test mal nur anzeigen, d. h. später ohne „echo“
    echo "sudo shred -v $device"
  fi	
done

Ach, und es darf auch eingerückt werden. 😉

Panzli

(Themenstarter)

Anmeldungsdatum:
17. Dezember 2021

Beiträge: 19

Danke, aber so muss doch erst der Shred durchlaufen, bevor mit device1 weitergemacht wird oder?

karzer Team-Icon

Wikiteam
Avatar von karzer

Anmeldungsdatum:
10. April 2022

Beiträge: 1479

Wohnort: Bad Oeynhausen

Wenn $device0 nicht "notdelete" ist natūrlich. Bei meiner Lösung allerdings nicht.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13075

Panzli schrieb:

Hallo zusammen, bei Folgenden Script würde ich gerne,dass die Variable aus der Schleife ausgeben ("returnt") wird, wie stelle ich dies am besten an?

Gebt mir gern noch weitere Verbesserungsvorschläge.

Was ist denn das Ziel der ganzen Geschichte? Im kleinen Maß habe ich verstanden, dass Du die Liste (das sollte vielleicht ein Array sein) filtern willst, so dass ein spezielles Device (vermutlich das, auf dem das OS installiert ist) herausgenommen wird. Ich würde das vermutlich eher so machen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
devices=(/dev/{a..d})
os="/dev/$(lsblk | grep /boot/efi | grep -o sd.)"

isOs() { test "$1" = "$os"; }


for d in "${devices[@]}"; do
  if isOs "$d"; then
    echo "Ignore $d"
  else
    echo "Work on $d"
  fi
done

Die Funktion lohnt natürlich nur, wenn Du die Logik an mehr als einer Stelle brauchst. Ansonsten würde ich den Test in die Schleife legen.

Panzli

(Themenstarter)

Anmeldungsdatum:
17. Dezember 2021

Beiträge: 19

Genau, ich möchte zeitgleich, dass alle drives außer dem Betriebsystem geshreddet werden.

karzer Team-Icon

Wikiteam
Avatar von karzer

Anmeldungsdatum:
10. April 2022

Beiträge: 1479

Wohnort: Bad Oeynhausen

Warum denn nicht nacheinander?

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13075

karzer schrieb:

Warum denn nicht nacheinander?

Weil's schneller geht wahrscheinlich.

Panzli schrieb:

Genau, ich möchte zeitgleich, dass alle drives außer dem Betriebsystem geshreddet werden.

Also sowas

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/bin/bash

os="/dev/$(lsblk | grep /boot/efi | grep -o sd.)"

for d in /dev/{a..d}; do
  if [ "$d" = "$os" ]; then
    echo "Ignore $d"
  else
    echo "Shreddering $d ..." &
  fi
done

wait

Zeile 11 muss dann natürlich das passende Kommando sein. Der wait stellt sicher, dass alle Kinder beendet sind, bevor dieses Skript sich beendet.

karzer Team-Icon

Wikiteam
Avatar von karzer

Anmeldungsdatum:
10. April 2022

Beiträge: 1479

Wohnort: Bad Oeynhausen

Geht es auch so?

1
2
3
4
5
6
7
8
9
# $array enthält die Inhalte aller $device-Variablen
devices_stri="" 
for elem in "${array[@]}" 
do 
if [[ $elem != "nodelete" ]]; then 
devices_stri+="$elem "
fi
done
sudo shred -v $devices_stri &

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13075

karzer schrieb:

Geht es auch so?

Nee, ohne Einrückung und Whitespace wird das nicht funktionieren. 😉

1
2
3
4
5
6
7
8
9
# $array enthält die Inhalte aller $device-Variablen
devices_stri="" 
for elem in "${array[@]}" 
do 
if [[ $elem != "nodelete" ]]; then 
devices_stri+="$elem "
fi
done
sudo shred -v $devices_stri &

Die letzte Zeile macht gar keinen Sinn, wenn wirklich ein Kommando alle Geräte plätten soll. Dann sollte man das nicht in den Hintergrund schicken. Ich finde das Array hier zu umständlich: da man sowieso nur ein Mal durch die Schleife muss, würde ich das lieber so machen wie in meinem Beispiel.

Und wenn Du schon mit Arrays arbeitest, dann würde ich devices_stri auch zu einem Array machen.

karzer Team-Icon

Wikiteam
Avatar von karzer

Anmeldungsdatum:
10. April 2022

Beiträge: 1479

Wohnort: Bad Oeynhausen

Hallo,

geht das denn?

sudo shred -v $devices_array

?

Oder muss es

sudo shred -v ${devices_array[*]}

sein?

rklm schrieb:

karzer schrieb:

Geht es auch so?

Nee, ohne Einrückung und Whitespace wird das nicht funktionieren. 😉

Das vergesse ich immer in den Forenbeiträgen...

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13075

karzer schrieb:

geht das denn?

sudo shred -v $devices_array

?

Oder muss es

sudo shred -v ${devices_array[*]}

sein?

Gehen tut das. Aber eigentlich macht man das mit dem Array so, wenn man denn schon ein Array nimmt:

1
sudo shred -v "${devices_array[@]}"

rklm schrieb:

karzer schrieb:

Nee, ohne Einrückung und Whitespace wird das nicht funktionieren. 😉

Das vergesse ich immer in den Forenbeiträgen...

Aber warum nur?

karzer Team-Icon

Wikiteam
Avatar von karzer

Anmeldungsdatum:
10. April 2022

Beiträge: 1479

Wohnort: Bad Oeynhausen

Vielen Dank für die Antwort! Jetzt weiß ich Bescheid.

rklm schrieb:

Aber warum nur?

Ich mache meistens Copy & Paste aus dem Terminal und sorge dann nur dafür, dass nicht alles auf einer Zeile steht... Werde ich jetzt ändern.

Antworten |