como lidar com argumentos ao executar um script

3

como lidar com argumentos ao executar um script

meu código é:

#!/bin/bash

DIR="$1"

if [ DIR eq $1 ]
then
    echo -n "total directories:" ; find $DIR -type d | wc -l
    echo -n "total files:" ; find $DIR -type f | wc -l
else
    echo " pass parameters"
fi

quando eu executo com o nome do script ( ./countfiledirs ) ele está mostrando como:

./countfiledirs: line 4: [: DIR: unary operator expected
 pass parameters

Se eu executar ./countfiledirs sem passar argumentos, ele deverá mostrar como:

pls pass arguments.

Se eu executar ./countfiledirs com a passagem de argumentos como ./countfiledirs / usr / share, ele deverá mostrar a saída como:

total directories:145
total files:254
    
por buddha sreekanth 05.05.2015 / 12:04

1 resposta

4

Seu erro está aqui:

if [ DIR eq $1 ]

Você não está usando a variável, essa é a string simples DIR . O que você quer é:

if [ "$DIR" = "$1" ]

No entanto, como você está configurando DIR="$1" , esse teste sempre será verdadeiro por definição. Além disso, quando $1 estiver vazio, o comando $DIR e find serão executados no diretório atual. Para muitas versões de find , esses comandos são equivalentes:

find . -name foo
find -name foo

Na ausência de um diretório de destino, find pesquisará . , o diretório atual. Então, uma versão funcional do seu script seria:

#!/bin/bash

## Avoid using UPPER CASE variable names in bash.
dir="$1"

## Check if $dir exists
if [ -e "$dir" ]
then
    printf "total directories: %s\n" $(find "$dir" -type d | wc -l)
    printf "total files: %s\n" $(find "$dir" -type f | wc -l)
else
    echo " pass parameters"
fi

O número de argumentos passados para um script bash é salvo como $# , então você também pode fazer

if [ $# -lt 1 ]
then
    echo "pass parameters"
    exit
fi
    
por 05.05.2015 / 12:16