Visa obesvarade inlägg | Visa aktiva trådar Aktuellt datum och tid: 04 jun 2020, 12:08



Svara på tråd  [ 5 inlägg ] 
 Enkelt menyprogram i terminalen 
Författare Meddelande

Blev medlem: 05 mar 2010, 23:08
Inlägg: 329
OS: Annat GNU/Linux
Svara med citat
Inlägg Enkelt menyprogram i terminalen
Jag har snickrat ihop ett enkelt menyprogram som fungerar utmärkt när jag anropar ett program/kommando i terminalen. Däremot så fungerar det inte så bra när jag anropar ett perl-skript. Det verkar som att kommandoradsargumentet inte når perl-skriptet överhuvudtaget, d.v.s. resultatet blir som att kommandot utförs utan argument (hjälptexten dyker upp).

Perl-skriptet körs med två eller fler argument.

Exempel:

Perl-skript [argument 1] [argument 2] osv.


Menyprogram:

Kod:
#!/bin/bash
clear
quit="no"
option1 () {
clear
echo
echo -n "Please input [hostname or IP adress]: "
read input
clear
/usr/sbin/traceroute "$input"
read -p "Press Enter to continue:"
}

while [ $quit != "yes" ]
do
clear
echo
echo "1. Traceroute"
echo "2. Quit"
echo -n "Your choice? : "
read choice

case $choice in
1) option1 ;;
2) quit="yes" ;;
*) echo "\"$choice\" is not a valid option"
sleep 2 ;;
esac
clear
done


Simpelt perl-skrip om ni känner för att testa.

Exempel:

$ skript.pl 6 + 3
$ skript.pl 6 - 3
$ skript.pl 6 \* 3
$ skript.pl 6 / 3

Perl-skript (Calculator):

Kod:
#!/usr/bin/perl -w
if ($#ARGV != 2 ) {
   print "usage: mycalc number1 op number2\neg: mycalc 5 + 3 OR mycalc 5 - 2\n";
   exit;
}
$n1=$ARGV[0];
$op=$ARGV[1];
$n2=$ARGV[2];
$ans=0;
if ( $op eq "+" ) {
   $ans = $n1 + $n2;
}
elsif ( $op eq "-"){
   $ans = $n1 - $n2;
}
elsif ( $op eq "/"){
   $ans = $n1 / $n2;
}
elsif ( $op eq "*"){
   $ans = $n1 * $n2;
}
else {
   print "Error: op must be +, -, *, / only\n";
   exit;
}
print "$ans\n";


13 jan 2011, 19:27
Profil

Blev medlem: 15 dec 2007, 03:20
Inlägg: 1269
OS: Xubuntu
Svara med citat
Inlägg Re: Enkelt menyprogram i terminalen
1) Jag förstår inte frågan. Du har två program och säger att det ena fungerar och inte det andra. Har det första programmet överhuvet nåt med det andra att göra?

2) Din perl-skrift fungerar för mej:
Kod:
$ ./skript.pl 2 + 3
5
$ ./skript.pl 2 / 3
0.666666666666667
$ ./skript.pl 2 - 3
-1


3) Jag har en del ovidkommande synpunkter på menyprogrammet, trots att det fungarar:
  • Det gör ofta "clear" (rensar terminalfönstret). Det är irriterande eftersom tidigare kommandon och output suddas. Det logiska kontinuiteten när man scrollar bakåt i terminalen försvinner. Ta bort alla "clear" så blir det snyggare, och då behövs inte heller "Press Enter to continue" och "sleep".
  • Det enda programmet gör är "traceroute". Det enda andra alternativet i menyn är "quit". Jämför med ett program som inte hade nån meny utan gör "traceroute" direkt, och sedan avslutas. Vill man köra det igen trycker man Uppåtpil + Return. Då får man inte bara ett program som är enklare att skriva utan också enklare att använda (eftersom Uppåtpil + Return är mer "standard" är 1 + Return för att upprepar alla möjliga program i terminalen).
Det här blev kvar av Menyprogram
Kod:
#!/bin/bash

read -p "Please enter hostname or IP adress: " input
/usr/sbin/traceroute "$input"


14 jan 2011, 00:30
Profil

Blev medlem: 05 mar 2010, 23:08
Inlägg: 329
OS: Annat GNU/Linux
Svara med citat
Inlägg Re: Enkelt menyprogram i terminalen
Hej & tack för synpunkterna.

1. Ingenting av dessa program/skript har någonting med saken att göra, jag ämnar att lägga till en massa annat.

2. Ja, perl-skriptet fungerar om man kör det rakt av. Min tanke var att köra ett liknande skript från ett menyprogram.

3. Det är meningen att göra clear screen, annars fungerar det inte som jag vill ha det. Skriptet ska köras när någon loggar in på ett särskilt konto, sedan när man avslutar med quit så ska man logga ut från systemet.

Folk som loggar in ska bara kunna köra det som jag har förutbestämt. Ett av skripten ska användas för att kalkulera routing tabeller till hexadecimal, för att sedan klistras in i en router, brandvägg eller server.

Anledningen till att jag valt att göra detta via en terminal, är att när det gäller att konfigurera ovan nämda utrustning, så är det terminalen som gäller.


14 jan 2011, 02:08
Profil
Användarvisningsbild

Blev medlem: 29 jul 2008, 19:42
Inlägg: 3292
OS: Arch Linux
Svara med citat
Inlägg Re: Enkelt menyprogram i terminalen
Använd 'strict' och 'warnings'. Alltid.
Använd lexicals (my $foo). Alltid.

Använd shift för att plocka av ett värde från en array:

Kod:
my $foo = shift;


Eller för att plocka flera värden:

Kod:
my($foo, $bar, $baz) = @ARGV;


Detta är vad som blev kvar av ditt perlscript.
Kod:
#!/usr/bin/perl
use strict;
print $_ = eval("@ARGV"); # string eval är evil - använd med måtta

_________________
ǁ A: Because it obfuscates the reading.
ǁ Q: Why is top posting so bad?


14 jan 2011, 09:23
Profil

Blev medlem: 05 mar 2010, 23:08
Inlägg: 329
OS: Annat GNU/Linux
Svara med citat
Inlägg Re: Enkelt menyprogram i terminalen
Tack för tipsen dmz, här är ett av perl-skripten som jag tänker använda.

Kod:
#!/usr/bin/perl -w

use strict;

sub option_121 {
    my $gw = shift;
    my $string = '';
    my ($subnet, $mask, $b0, $b1, $b2, $b3);
    foreach my $cidr (@_) {
        ($subnet,  $mask) = split('/', $cidr);
        ($b0, $b1, $b2, $b3) = split(/\./, $subnet);
        $string .= sprintf('%02x', $mask);
        $string .= sprintf('%02x', $b0);
        $string .= sprintf('%02x', $b1) if($mask > 8);
        $string .= sprintf('%02x', $b2) if($mask > 16);
        $string .= sprintf('%02x', $b3) if($mask > 24);
        $string .= sprintf('%02x%02x%02x%02x', split(/\./, $gw));
    }
    return $string;
}

if(@ARGV < 2)
{
    print "\n";
    print "Usage: $0 [gateway] [host|network]/[bitmask]\n\n";
    print "Example: $0 192.168.0.1 192.168.10.0/24\n\n";
}
elsif($ARGV[0] =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/)
{
    print "DHCP option 121 (249) hex string: ".option_121(@ARGV)."\n";
}
else
{
    print "Invalid gateway IP address: '$ARGV[0]'\n";
}


15 jan 2011, 03:20
Profil
Visa inlägg nyare än:  Sortera efter  
Svara på tråd   [ 5 inlägg ] 

Vilka är online

Användare som besöker denna kategori: Google [Bot] och 5 gäster


Du kan inte skapa nya trådar i denna kategori
Du kan inte svara på trådar i denna kategori
Du kan inte redigera dina inlägg i denna kategori
Du kan inte ta bort dina inlägg i denna kategori
Du kan inte bifoga filer i denna kategori

Sök efter:
Hoppa till:  
cron
Main Engineer for phpBB3: Bertie at phpBB.com © 2000 - 2002, 2005 - 2007, the Group behind the Open Source code of phpBB.
Designed by STSoftware, modified by Katt, Konservburk & Peetra. Swedish translation by Peetra & phpBB Sweden © 2006-2011