Problem w skrypcie

0

Mam problem ze skryptem, który ma wypisywać informacje o zadanym numerze UID danego usera. Problem jest przy przypisywaniu zmiennej OPIS. Tylko nie wiem gdzie jest błąd:

#!/bin/bash
if [[ $# == 0 ]; then
    exit 1
else
    nUID=$1
    OPIS=`cat /etc/passwd | awk -F':' '{if($3 == $nUID) print $5}'`
    if [ $OPIS ]; then
        echo "$OPIS"
    else
        echo "Brak opisu"
    fi
fi
1

Problem polega na przekazywaniu zmiennych środowiskowych do interpretera awk. Można to zrobić na kilka sposobów. Miałeś też kilka innych rzeczy do poprawy. Spróbuj coś takiego:

#!/bin/bash
test $# -ne 0 || exit 1
nUID="$1"
OPIS=$(awk -v id="$nUID" -F':' '{ if ($3 == id) print $5}' < /etc/passwd)
if [[ -n $OPIS ]]; then
    echo "$OPIS"
else
    echo "Brak opisu"
fi
0

Zachowując oryginalny interfejs:

#!/usr/bin/env bash

(( $# )) || exit 1

awk -F : -v uid="$1" '
$3 == uid {
    print $5 ? $5 : "Brak opisu"
    exit
}
' /etc/passwd

Można to zrobić w czystym Bashu. Najtrudniejsza część nie wygląda tak strasznie:

...
while IFS=: read -r _ _ uid _ gecos _; do
    ...
done </etc/passwd

Dwie uwagi:

  1. Idiomatycznie program powinien zwracać status 2, jeżeli jego użycie jest niepoprawne (nieznana opcja, niepoprawna liczba argumentów, itp.):
$ grep -x
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.
$ echo $?
2

$ curl -x
curl: option -x: requires parameter
curl: try 'curl --help' or 'curl --manual' for more information
$ echo $?
2

$ printf
printf: usage: printf [-v var] format [arguments]
$ echo $?
2
  1. grep(1) zwraca status 1, jeżeli nie uda mu się odnaleźć pasującej linii:
$ grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
$ echo $?
0

$ grep doot /etc/passwd
$ echo $?
1
$ 

Może Twój program powinien informować o niepowodzeniu w podobny sposób?

1 użytkowników online, w tym zalogowanych: 0, gości: 1