Enkelt menyprogram i terminalen

Här diskuterar vi skal, kommandon och klassiska linuxverktyg.
Andersen
Inlägg: 329
Blev medlem: 05 mar 2010, 23:08
OS: Annat GNU/Linux

Enkelt menyprogram i terminalen

Inlägg av Andersen »

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: Markera allt

#!/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: Markera allt

#!/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";
David Andersson
Inlägg: 1269
Blev medlem: 15 dec 2007, 03:20
OS: Xubuntu

Re: Enkelt menyprogram i terminalen

Inlägg av David Andersson »

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: Markera allt

$ ./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: Markera allt

#!/bin/bash

read -p "Please enter hostname or IP adress: " input
/usr/sbin/traceroute "$input"
Andersen
Inlägg: 329
Blev medlem: 05 mar 2010, 23:08
OS: Annat GNU/Linux

Re: Enkelt menyprogram i terminalen

Inlägg av Andersen »

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.
Användarvisningsbild
dmz
Inlägg: 3292
Blev medlem: 29 jul 2008, 19:42
OS: Arch Linux

Re: Enkelt menyprogram i terminalen

Inlägg av dmz »

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: Markera allt

my $foo = shift;
Eller för att plocka flera värden:

Kod: Markera allt

my($foo, $bar, $baz) = @ARGV;
Detta är vad som blev kvar av ditt perlscript.

Kod: Markera allt

#!/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?
Andersen
Inlägg: 329
Blev medlem: 05 mar 2010, 23:08
OS: Annat GNU/Linux

Re: Enkelt menyprogram i terminalen

Inlägg av Andersen »

Tack för tipsen dmz, här är ett av perl-skripten som jag tänker använda.

Kod: Markera allt

#!/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";
}
Skriv svar

Återgå till "Terminalforum"