スクリプト実行時にパラメータを処理する方法

スクリプト実行時にパラメータを処理する方法

スクリプト実行時にパラメータを処理する方法

私のコードは次のとおりです

#!/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

スクリプト名()を使用して実行すると、./countfiledirs次のように読み取られます。

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

パラメータを渡さずに実行すると、./countfiledirs次のように表示されます。

pls pass arguments.

./countfiledirs を実行し、引数を ./countfiledirs /usr/share に渡すと、次のような出力が表示されます。

total directories:145
total files:254

ベストアンサー1

エラーは次のとおりです。

if [ DIR eq $1 ]

変数を使わずに単純な文字列ですDIR。あなたが望むもの:

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

ただし、これを設定しているため、DIR="$1"定義に応じてこのテストは常にtrueです。また、$1空の場合、現在のディレクトリでも$DIRコマンドがfind実行されます。多くのバージョンでは、find次のコマンドは同じです。

find . -name foo
find -name foo

宛先ディレクトリがない場合は、現在のディレクトリをfind検索します.。したがって、スクリプトの作業バージョンは次のようになります。

#!/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

Bashスクリプトに渡された引数の数は、次のように$#保存されます。

if [ $# -lt 1 ]
then
    echo "pass parameters"
    exit
fi

おすすめ記事