naucho
Goto Top

Batch Befehle in Shell umwandeln

Hallo an Alle,

und zwar soll ich ein Script was mit in Batch vorliegt in Shell umformen , weil wir bald einen Linux Server bekommen.

Leider habe ich da sozusagen kaum Erfahrung, es ist auch nicht so einfach darum bitte ich Euch quasi um Hilfe hier.


Hier mal ein paar Zeilen die ich umformen soll:
set bds_dir=%bds_rootDir_Aufbau%\_anne_neu
set NLS_CHARACTERSET=WE8ISO8859P15
call sqlplus "%db_user%/%db_password%@%db_instance%" @%bds_dir%\createTable_ANNE.sql  
rem rem rem move %bds_dir_quelldaten%\*.csv %bds_dir_quelldaten%\%INFILE%
pushd %bds_dir_benu%
set SOURCE_DIR=%bds_rootDir_Quelldaten%\anne
set TARGET_DIR=%bds_rootDir_Datensicherung_f%\_anne

set DATAFILE=%1

Ich hoffe ihr könnt mir da ein wenig helfen ,sodass ich als Einsteiger damit umgehen kann.


Gruß Naucho

Content-ID: 75795

Url: https://administrator.de/contentid/75795

Ausgedruckt am: 17.11.2024 um 05:11 Uhr

Dani
Dani 12.12.2007 um 13:05:45 Uhr
Goto Top
Hallo Naucho,
an sich sollte das kein Problem sein. Ich Versuche es mal: face-wink
#!/bin/bash

bds_dir="PFAD"  
NLS_CHARACTERSET="WE8ISO8859P15"  
???
rem mv "%bds_dir_quelldaten%/*.csv" "%bds_dir_quelldaten%/%INFILE%"  
???
SOURCE_DIR="PFAD"  
TARGET_DIR="PFAD"  

DATAFILE=$1
Die ??- Zeilen sind die Batchzeilen, wo ich nicht schlau draus werde was du da machst bzw. vorhast.

Zeile 3:
Was soll dort genau passieren?!

Zeile 4:
ein rem reicht eigentlich völlig aus. face-smile

Zeile 5:
Was genau macht pushd ? Kann leider damit nichts anfangen.

Die einzelnen Variablen wie %bds_rootDir_Datensicherung_f%, %bds_rootDir_Quelldaten%, etc... musst du natürlich auch noch deklarieren bzw. sind das bei die Systemvariablen? Sprich wurden von einem Programm erzeugt und sind somit immer vorhanden.


Grüße
Dani
Naucho
Naucho 12.12.2007 um 13:10:31 Uhr
Goto Top
Das gute ist , ich weiß das selbst nicht klingt doof ist aber so.

Bin inner Ausbildung und soll diese Zeilen in Shell abändern , blicke leider selbst nicht durch.

Dies ist Batch und ich soll sie in Shell abwandeln...
Dani
Dani 12.12.2007 um 13:17:48 Uhr
Goto Top
Na, das kann aber nicht die Ganze Batchdatei gewesen sein. <grübel>

Weil das Script ist so nicht vollständig. Geh mal in die Eingabeaufforderung und gebe einfach echo %bds_rootDir_Aufbau% ein. Falls ein Wert exstiert, ist es eine Systemvariable. Andernfalls eine erzeugte (zur Laufzeit) Variable.

Die Zeilen, wo ich bisher umgesetzt habe, hättest du sicher auch mit Google hinbekommen. Denn SHELL-Scripts gibts da genug zum Spicken.


Gruß
Dani

PS: In Ausbildung sollte man eigentlich zuerst einmal ein bisschen googlen und Howto zur Shell lesen. Dann ist vieles einfacher. Denn Linux ist definitiv ein wichtiger Bestandteil der IT. Daran wird sich so schnell sicher nichts ändern - im Gegenteil.
Naucho
Naucho 12.12.2007 um 13:32:53 Uhr
Goto Top
Hier dann mal das komplette Script, ich habe 0 Erfahrung damit , wenn ich ein fertig umgesetztes Beispiel habe , kann ich mich daran orientieren.

Ich hoffe ihr könnt mir da weiterhelfen hier nun das Script:
@echo off
cls

call ..\admin\Environment\env_bds.bat

set bds_dir=%bds_rootDir_Aufbau%\_anne_neu
set bds_dir_quelldaten=%bds_rootDir_Quelldaten%\Anne
set bds_dir_benu=%bds_rootDir_Aufbau%\Admin\Benutzerverwaltung
set bds_dir_logfiles=%bds_rootDir_Logfiles%\anne

set NLS_CHARACTERSET=WE8ISO8859P15
set NLS_NCHAR_CHARACTERSET=WE8ISO8859P15
set NLS_LANG=GERMAN_GERMANY.WE8ISO8859P15

 call sqlplus "%db_user%/%db_password%@%db_instance%" @%bds_tools_dir%\set_aktBeladungstermin.sql  
 call sqlplus "%db_user%/%db_password%@%db_instance%" @%bds_protAppDir%\insertIntoJobkontrolle.sql ANNE 1 JOB_START ANNE  

    
echo --------------------------------------------------------------------
echo -- (01) create Table t_anne
echo --------------------------------------------------------------------

    call sqlplus "%db_user%/%db_password%@%db_instance%" @%bds_dir%\createTable_ANNE.sql  


echo --------------------------------------------------------------------
echo -- (02) load Table t_anne
echo --------------------------------------------------------------------

    set INFILE=AB_ANNE_BDS_20071021.csv
    rem rem rem move %bds_dir_quelldaten%\*.csv %bds_dir_quelldaten%\%INFILE%
    
    call sqlldr userid=%db_user%/%db_password%@%db_instance% control=%bds_dir%\loadTable_ANNE.ctl log=%bds_dir_logfiles%\%AKT_STAND_KW%_loadTable_ANNE.log bad=%bds_dir_logfiles%\%AKT_STAND_KW%_loadTable_ANNE.bad direct=Y skip=1 data=%bds_dir_quelldaten%\%INFILE%


echo --------------------------------------------------------------------
echo -- (03) arbeiten an Tabelle t_anne
echo --------------------------------------------------------------------
    
    call sqlplus "%db_user%/%db_password%@%db_instance%" @%bds_dir%\worksForTable_Anne.sql  


echo --------------------------------------------------------------------------------
echo -- (88) Anne Quelldaten sichern
echo --------------------------------------------------------------------------------

    call 88_zipMoveAndDelSourcefiles_ANNE.bat %INFILE%


echo -----------------------------------------------------------------------------------
echo -- Rechte granten fuer Tabelle ANNE
echo -----------------------------------------------------------------------------------

     pushd %bds_dir_benu%
         call run_grant_Rights_for_System ANNE
     popd


 call sqlplus "%db_user%/%db_password%@%db_instance%" @%bds_protAppDir%\insertIntoJobkontrolle.sql ANNE 2 JOB_ENDE ANNE  
58502
58502 12.12.2007 um 13:35:44 Uhr
Goto Top
@Dani

pushd /?
 
Sichert das aktuelle Verzeichnis für die Benutzung des Befehls POPD, und
wechselt dann zum angegebenen Verzeichnis.
 
PUSHD [Pfad|...]
  
     Pfad Gibt das Verzeichnis an, zu dem gewechselt werden soll.
Naucho
Naucho 12.12.2007 um 13:45:17 Uhr
Goto Top
Könnt Ihr mir denn bei dem Script weiterhelfen ?

Dies soll in Shell umgeformt werden , ich habe wirklich 0 Erfahrung da drinne.

Es ist für mich eine große Hilfe , wenn ich den Vergleich habe von Batch in Shell , hätte ich die Erfahrung würde ich mich dran setzen.

Nur habe ich diese nicht und weiß nicht wo ich überhaupt anfangen soll.

Danke erstmal an Euch
Dani
Dani 12.12.2007 um 15:15:05 Uhr
Goto Top
@7stein
Danke für den Hinweis. Kenn leider nicht den Befehl unter Linux dazu. face-confused
#!/bin/bash
clear

call ..\admin\Environment\env_bds.bat <===BATCHZEILE


bds_dir=%bds_rootDir_Aufbau%/_anne_neu
bds_dir_quelldaten=%bds_rootDir_Quelldaten%/Anne
bds_dir_benu=%bds_rootDir_Aufbau%/Admin/Benutzerverwaltung
bds_dir_logfiles=%bds_rootDir_Logfiles%/anne

NLS_CHARACTERSET=WE8ISO8859P15
NLS_NCHAR_CHARACTERSET=WE8ISO8859P15
NLS_LANG=GERMAN_GERMANY.WE8ISO8859P15

call sqlplus "%db_user%/%db_password%@%db_instance%" @%bds_tools_dir%\set_aktBeladungstermin.sql  <===BATCHZEILE  
 call sqlplus "%db_user%/%db_password%@%db_instance%" @%bds_protAppDir%\insertIntoJobkontrolle.sql ANNE 1 JOB_START ANNE  <===BATCHZEILE  

    
echo --------------------------------------------------------------------
echo -- (01) create Table t_anne
echo --------------------------------------------------------------------

    call sqlplus "%db_user%/%db_password%@%db_instance%" @%bds_dir%\createTable_ANNE.sql  <===BATCHZEILE  


echo --------------------------------------------------------------------
echo -- (02) load Table t_anne
echo --------------------------------------------------------------------

    INFILE=AB_ANNE_BDS_20071021.csv
    rem move %bds_dir_quelldaten%\*.csv %bds_dir_quelldaten%\%INFILE%  <===BATCHZEILE
    
    call sqlldr userid=%db_user%/%db_password%@%db_instance% control=%bds_dir%\loadTable_ANNE.ctl log=%bds_dir_logfiles%\%AKT_STAND_KW%_loadTable_ANNE.log bad=%bds_dir_logfiles%\%AKT_STAND_KW%_loadTable_ANNE.bad direct=Y skip=1 data=%bds_dir_quelldaten%\%INFILE%  <===BATCHZEILE


echo --------------------------------------------------------------------
echo -- (03) arbeiten an Tabelle t_anne
echo --------------------------------------------------------------------
    
    call sqlplus "%db_user%/%db_password%@%db_instance%" @%bds_dir%\worksForTable_Anne.sql  <===BATCHZEILE  


echo --------------------------------------------------------------------------------
echo -- (88) Anne Quelldaten sichern
echo --------------------------------------------------------------------------------

    call 88_zipMoveAndDelSourcefiles_ANNE.bat %INFILE% <===BATCHZEILE


echo -----------------------------------------------------------------------------------
echo -- Rechte granten fuer Tabelle ANNE
echo -----------------------------------------------------------------------------------

     pushd %bds_dir_benu%  <===BATCHZEILE - Kenne den Befehl unter Linux nicht
         call run_grant_Rights_for_System ANNE  <===BATCHZEILE
     popd  <===BATCHZEILE - Kenne den Befehl unter Linux nicht


 call sqlplus "%db_user%/%db_password%@%db_instance%" @%bds_protAppDir%\insertIntoJobkontrolle.sql ANNE 2 JOB_ENDE ANNE  <===BATCHZEILE  
Ich habe die entsprechenden Zeilen markiert, die du doch selber ausarbeiten musst. Da ich nicht weiß, was der Befehl (z.B. sqlldr) macht.
Nicht vergessen diese Zeile (call ..\admin\Environment\env_bds.bat
) + die Datei auch noch anzupassen.


Grüße
Dani
Naucho
Naucho 12.12.2007 um 15:38:34 Uhr
Goto Top
Ich danke dir erstmal dafür !

Hilft mir ja schon ein wenig weiter ...
Naucho
Naucho 18.12.2007 um 12:51:55 Uhr
Goto Top
Komme ehrlich gesagt nicht sonderlich weiter , zumal ich da 0 Erfahrung habe.

Nunja , vielleicht gibt es ja hier im Forum Leute die sich doch besser damit noch auskennen.


Hier mein überarbeitetes Script:

#!/bin/bash
clear

call ..\admin\Environment\env_bds.bat


bds_dir=$bds_rootDir_Aufbau/_anne_neu
bds_dir_quelldaten=$bds_rootDir_Quelldaten/Anne
bds_dir_benu=$bds_rootDir_Aufbau/Admin/Benutzerverwaltung
bds_dir_logfiles=$bds_rootDir_Logfiles/anne

NLS_CHARACTERSET=WE8ISO8859P15
NLS_NCHAR_CHARACTERSET=WE8ISO8859P15
NLS_LANG=GERMAN_GERMANY.WE8ISO8859P15

call sqlplus "%db_user%/%db_password%@%db_instance%" @%bds_tools_dir%\set_aktBeladungstermin.sql
call sqlplus "%db_user%/%db_password%@%db_instance%" @%bds_protAppDir%\insertIntoJobkontrolle.sql ANNE 1 JOB_START ANNE


echo --------------------------------------------------------------------
echo -- (01) create Table t_anne
echo --------------------------------------------------------------------

call sqlplus "%db_user%/%db_password%@%db_instance%" @%bds_dir%\createTable_ANNE.sql


echo --------------------------------------------------------------------
echo -- (02) load Table t_anne
echo --------------------------------------------------------------------

INFILE=AB_ANNE_BDS_20071021.csv
rem move $bds_dir_quelldaten\*.csv $bds_dir_quelldaten\%INFILE%

call sqlldr userid=%db_user%/%db_password%@%db_instance% control=%bds_dir%\loadTable_ANNE.ctl log=%bds_dir_logfiles%\%AKT_STAND_KW%_loadTable_ANNE.log bad=%bds_dir_logfiles%\%AKT_STAND_KW%_loadTable_ANNE.bad direct=Y skip=1 data=%bds_dir_quelldaten%\%INFILE% <===BATCHZEILE


echo --------------------------------------------------------------------
echo -- (03) arbeiten an Tabelle t_anne
echo --------------------------------------------------------------------

call sqlplus "%db_user%/%db_password%@%db_instance%" @%bds_dir%\worksForTable_Anne.sql


echo --------------------------------------------------------------------------------
echo -- (88) Anne Quelldaten sichern
echo --------------------------------------------------------------------------------

call 88_zipMoveAndDelSourcefiles_ANNE.bat %INFILE%


echo -----------------------------------------------------------------------------------
echo -- Rechte granten fuer Tabelle ANNE
echo -----------------------------------------------------------------------------------

pushd $bds_dir_benu
call run_grant_Rights_for_System ANNE
popd


call sqlplus "%db_user%/%db_password%@%db_instance%" @%bds_protAppDir%\insertIntoJobkontrolle.sql ANNE 2 JOB_ENDE ANNE
Dani
Dani 18.12.2007 um 13:11:11 Uhr
Goto Top
Hi!
Also du erstmal herausfinden, was "call sqlplus....", "call sqlldr..." macht. Denn ich bin mir fast sicher, die Befehle gibt es unter Linux nicht.
Des Weitern wäre es nicht schlecht, wenn du mal für jede ZEile im Batch notierst was am Ende dieser Zeile passieren sollte.
Beispiel:
call sqlplus "%db_user%/%db_password%@%db_instance%" @%bds_dir%\worksForTable_Anne.sql   
Denn ich als Außenstehender kann damit nichts anfangen!
---
Des Weiteren rufst in dieser "alten" Batch nochmal eine Batchdatei (call 88_zipMoveAndDelSourcefiles_ANNE.bat ...) auf. Diese musst du natürlich auch umstellen. Nicht zu vergessen, den call am Anfang (call ..\admin\Environment\env_bds.bat ). Die am Ende natürlich auch (call run_grant_Rights_for_System....).
Es gibt doch auch eine Aufgabenbschreibung, was genau (SChritt für Schritt) in diesem Script passieren soll. Denn es ist auf jeden Fall keins aus der Sorte "Ich wurde geschrieben, weils mir langweilig war". DAfür ist es zulange und zu kompliziert.
Für "pushd ...." bzw. "popd..." musst du wohl googlen. Ich kenne auf Anhieb keinen Befehl unter Linux, der das Gleiche macht.


Grüße
Dani
Naucho
Naucho 18.12.2007 um 15:42:00 Uhr
Goto Top
Ich habe dieses Script nicht geschrieben und weiß selbst nicht , was da genau passiert.

Habe nur die Ruhmvolle Aufgabe dieses Script genauso unter Linux fähig zu machen.

Vielleicht versteht man nun meine Lage , übrigens der Mitarbeiter der es war ist schon längst nicht mehr im Hause.
Biber
Biber 18.12.2007 um 19:07:01 Uhr
Goto Top
Moin Naucho,

Ich habe dieses Script nicht geschrieben ...
Lass ich gelten.
und weiß selbst nicht , was da genau passiert.
Dann finde es heraus.

Die paar Batchzeilen oben verraten in der Tat recht wenig darüber, was dort passiert.
Das liegt aber daran, dass eigentlich ein Sack voll anderer Skripte (vermutlich ein paar 1000 Zeilen) aufgerufen werden.
  • Sqlldr ist der so genannte Oracle SQL-Loader, der genau wie
  • sqlPlus, ein Oracle SQL-Client-Utitily, dass auch *.sql-Skripte "als Batch" ausführen kann
  • der "88_zipMoveAndDelSourcefiles_ANNE.bat", der wiederum sicherlich auch ein Zip-Utility aufruft...

Alles das unterstellt, dass auf der Linux-Büchse gleichnamige Skripte und Executables und Datenbankclients und Datenbank-Connections da und im Suchpfad sind. Und die zwei Dutzend SQL-Input-Files,die als Parameter angegeben sind. Und die Rechte, dies alles unter Linix anfassen zu dürfen.

Also, ich will mich hier nicht aufregen *laaaaaaaaaaaaaaaangsam bis 200 zähle* , aber ich denke, Du hast die Aufgabe falsch verstanden.

Ich versuche es mal ganz vorsichtig:
Bevor Du ein Skript in eine völlig andere Umgebung "migrierst", "übersetzt", "portierst" oder was immer Du glaubst mit der versuchten Wort-für-Wort-Übersetzung erreichen zu können, davor musst Du doch wenigstens halbwegs wissen
  • was liegt an Input vor oder muss als Ressource (Utility, Steuerdatei, SQL-Skript) vorhanden sein?
  • was soll das Skript bewirken?
  • wie ist die Verarbeitungslogik (nicht die handwerkliche Umsetzung, sondern abstrakt)?

Du kannst doch nicht ein Aquarium zentimeterweise in eine Honda GoldWing "übersetzen" oder ein Glas Becks Schluck für Schluck in eine Dose Erbsen, oder?

Und einen Windows-CMD-Batch kannst Du auch nur dann Zeile für Zeile "umstellen", wenn er nur interne Befehle enthalten würde. Nicht aber, wenn dieser Batch ein Nacheinander-Aufrufen von vielen bunten (Windows-) Utilities ist.

So, und nun klär, was da überhaupt zu den letzten drei Spielgelstrichen zu sagen ist, und kann können wir ein neues Bash-Skript entwerfen.

Oder Du sagst Deinem Cheffe, das keinerlei Kommentare und keinerlei Dokumentation vorhanden sind und dass es deshalb nur ein/e Entwickler/in entschlüsseln kann.

Hier im Forum z.B. gibt es mehrere, die man/frau mieten kann.

Grüße
Biber