2016-04-22 9 views
-6

Ich habe ein Shell-Skript:Wie kann ich mein Shell-Skript in Perl konvertieren?

#!usr/bin/bash 
branch_name=$1 
task_name=$2 
createviewset ccm -b $branch_name -t $task_name 
source setenv $task_name 
rest of the code 

Jetzt möchte ich dieses Skript in eine Perl-Skript konvertieren. Wie kann ich das machen? Soweit habe ich im Code geschrieben, aber dieser Code scheint nicht zu funktionieren.

!/usr/bin/perl 
use warnings; 
use strict; 
my branch_name; 
my task_name; 
createviewset ccm -b $branch_name -t $task_name 
source setenv $task_name 

Hier die createviewset ist ein bestehendes Skript, das ich hier aufrufen.

+4

Nun, Shell-Skripte und Perl sind ziemlich unterschiedlich. Sie können nicht erwarten, dass Code von einem mit dem anderen funktioniert. Du wirst * wirklich etwas Perl lernen müssen. Und das ist ein viel zu breites Thema für eine Stack Overflow-Frage. – Biffen

+2

Das erste Problem, das ich sehe, ist, dass Sie nie auf die Comman-Line-Parameter zugreifen, die nächste ist, dass Sie nicht wissen, externen Code aufzurufen. Es gibt wahrscheinlich mehr, aber die dringende Frage ist: Du weißt offensichtlich nicht viel Perl, also warum willst du das Skript konvertieren? - Und wie @Biffen gesagt hat, ist das Lernen von Perl hier ein viel zu weites Thema. – Henrik

+0

@Henrik: * "Sie greifen nie auf die Parameter der comman-Zeile zu" * Die ersten beiden Parameter werden in die temporären Variablen 'branch_name' und' task_name' kopiert und der Code verwendet diese. Ich weiß, dass es in Mode ist, Bash-Skripts kurz und kryptisch zu machen, aber IMO ist dies eine ausgezeichnete Möglichkeit, zu dokumentieren, was der Code macht. – Borodin

Antwort

3

Sie sollten http://perlmaven.com/ (verfügbar in vielen Sprachen) oder http://learn.perl.org/ besuchen, um etwas Perl zuerst zu lernen.

Ihr Shell-Skript muss die Befehlszeilenwerte nicht kopieren. Du auch # usr/bin/bash verwendet, die nicht funktionieren, weil der Pfad entweder/usr/bin/bash oder (häufiger)/bin/bash ist:

#!/bin/bash 
createviewset ccm -b $1 -t $2 
source setenv $2 
rest of the code 

Perl weist alle Argumente Befehlszeile the array @ARGV. Dieses Beispiel druckt Ihre zwei Argumente:

#!/usr/bin/perl 
print $ARGV[0]; 
print $ARGV[1]; 

Beachten Sie, dass die Nummerierung mit 0 beginnt anstelle von 1, wie in $ 1 in Ihrem Bash-Skript.

Im nächsten Teil werden externe (Shell-) Befehle in Perl ausgeführt: Verwenden Sie the system command.

#!/usr/bin/perl 
use strict; 
use warnings; 

system 'createviewset','ccm','-b',$ARGV[0],'-t',$ARGV[1]; 
system 'source','setenv',$ARGV[1]; 

Beachten Sie, dass die Quelle Befehl funktioniert nicht, da ein Perl-Skript nicht ein Shell-Skript und kann nicht „schließen“ Bash-Skript. Ich schätze, dass Sie versuchen, Perl für Ihr Problem zu verwenden, aber es sieht so aus, als ob Bash das viel bessere Werkzeug dafür ist.

+1

Ich glaube nicht, dass das OP es verdient hat, aber das ist eine verdammt gute Antwort. Das einzige, was ich ändern würde, wäre 'my ($ branch_name, $ task_name) = @ ARGV'. Auf diese Weise ist der Code aussagekräftiger und entspricht besser dem ursprünglichen Bash-Code des OPs, und das Problem der Indizes ist irrelevant. – Borodin

+0

Sie haben Recht. Ich versuche normalerweise zu vermeiden, alles zu kopieren, da es sehr teuer ist, wenn es stark benutzt wird, aber es wäre besser für die Ausbildung. – Sebastian

+0

Ich denke * "sehr teuer" * ist unrealistisch. Sehr wenige Anwendungen bestehen aus einem zentralen Bash-Skript, bei dem die Kopien millionenfach erstellt werden. Die Hauptgründe, '$ 1',' $ 2' usw. in einem Bash-Skript zu verwenden, sind der Kürze halber, und es gibt * keinen Grund *, auf @ ARGV'-Elemente direkt im Perl-Code zuzugreifen – Borodin

Verwandte Themen