Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2012
    Messaggi
    91

    [BASH-SHELLSCRIPTING] dubbio banale

    ciao sto cercando di risolvere un esercizio di bash e mi sono reso conto di avere qualche dubbio sullo shell-Scripting e BASH che proprio non riesco a risolvere:

    devo verificare che nei gruppi ci siano solo utenti omonimi
    es : viero:x:1000:viero

    codice:
    #!/bin/bash
    result=`cat /etc/group`
    if[" cat $result | cut -f1 -d: = "cat $result | cut -f4 -d:"]
    then 
    echo "OK"
    , ma non funziona nulla e stampa un output vuoto .
    Credo di non aver capito alcune cose :l'output di un comando come cat ,find o ls (e simili) quando effettuo la ridirezione dello stdout con la pipe è processato tutto in una volta (dopo che è finito di essere prodotto ) , o solo una riga alla volta ?

    come posso in un caso come questo confrontare i campi di una stringa processata con cut tutto in un colpo ?

    grazie

  2. #2
    • la riga dell'if non può funzionare, basta anche solo l'evidenziazione della sintassi del forum a fartelo capire: se apri delle virgolette in quel modo il contenuto (sostituzioni di variabili a parte) è interpretato come testo, mentre quello che vuoi tu è fare un confronto tra output di comandi; per catturare l'output dei comandi si usano i backtick (`comando`) o la sintassi $(comando) (entrambe si possono - e nel caso dell'[ si devono - includere tra apici doppi);
    • la chiusa quadra va staccata dall'ultimo carattere dell'espressione del confronto (deve rimanere come argomento separato);
    • cat stampa il contenuto del file specificato, ma in result tu hai già messo il contenuto del file stesso; cat $result darà risultati bizzarri (probabilmente un mucchio di file not found, visto che cercherà dei file con nome corrispondente alle varie righe di /etc/group
    • in generale, comandi come cut & co. non necessitano di un "cat" in pipe all'inizio - puoi specificare il file da aprire direttamente sulla riga di comando.


    Alla luce di tutto questo, si può riscrivere il tutto come:
    codice:
    #!/bin/bash
    if [ "`cut /etc/group -f1 -d:`" = "`cut /etc/group -f4 -d:`" ]
    then
        echo OK
    fi
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2012
    Messaggi
    91
    Quote Originariamente inviata da MItaly Visualizza il messaggio
    Alla luce di tutto questo, si può riscrivere il tutto come:
    codice:
    #!/bin/bash
    if [ "`cut /etc/group -f1 -d:`" = "`cut /etc/group -f4 -d:`" ]
    then
        echo OK
    fi
    ciao grazie della risposta , tuttavia ho ancora un dubbio : il mio obbiettivo era di verificare che per un gruppo specifico utente , es utente piero ha un gruppo piero , non ci siano altri utenti extra aggiunti :
    nel caso della soluzione che mi hai proposto , come è possibile tutto cio?
    il primo cut taglia tutto il file fino a EOF prendendo il field 1 , il secondo cut fa lo stesso con il field 4 ; com'è possibile poi fare il confronto?

  4. #4
    A sinistra avrò una stringa contenente tutti i campi 1 delimitati da a-capo, a destra la corrispondente stringa con i campi 4 delimitati da a-capo, per cui se l'obiettivo è verificare se globalmente tutti i gruppi hanno come utente associato solo un utente con lo stesso nome la cosa si risolve così.
    Se invece vuoi sapere la situazione per ogni gruppo, devi ciclare sulle righe del file (vedi qui) e applicare la cut su ciascuna riga.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.