私は1つの引数(ディレクトリ名)を受け入れ、そのディレクトリ内のファイル、ディレクトリ、読み取り可能ファイル、書き込み可能ファイル、および実行可能ファイルの数を示すシェルスクリプトを作成しています。引数なしで実行すると、エラーメッセージが表示され、中止されます。また、指定されたパラメーターが存在しない場合は、エラーメッセージを表示して中断する必要があります。それ以外の場合は、上記の情報を表示する必要があります。私は生涯にわたってそれを動作させることはできません。これが私が持っているものです。助けてください! :
#!/bin/csh
$1
set file=$1
if ($file==0)then
echo "usage: assignment6.sh <directory_name>"
exit0
else
if (-e $file && -r $file) then
echo "Number of Directories: `ls | wc -w`"
echo "Number of Files: `ls -d */ | wc -w`"
echo "Number of Readable files: `find * -type f -or -type d -maxdepth 0 -perm +u=r | wc -w`"
echo "Number of Writable files: `find * -type f -or -type d -maxdepth 0 -perm +u=w | wc -w`"
echo "Number of Executable files: `find * -type f -or -type d -maxdepth 0 -perm +u=x | wc -w`"
else
if (! -e $file) echo "No such directory."
exit 0
endif
endif
exit 0
答え1
このスクリプトの問題:
- 解析中の出力です
ls
。 解析されていませんls
。 - スペースを含まないファイル名を使用しています。または改行文字。 これにはどちらも含めることができます。
- あなたは
csh
すべてを自分で使用しています。これはシェルスクリプトにとって悪い考えです。 Bash、Ksh、Zsh、ほぼ何もないしかし、これはcsh
より良い考えです。 (私の考えですが、リンクされた事実の推論を注意深く読んでください。)
これはプログラムのこの部分のPOSIX互換バージョンです。 (後で時間が経つと、残りの機能も含めることができます。)
これは引数リストよりも多くのファイルがある場合を処理しませんが、次のように変更できます。本物必要。
#!/bin/sh
[ "$#" -eq 1 ] && [ -d "$1" ] || {
printf 'Usage:\t%s <directory>\n' "$0"
exit 1
}
dirs="$(find "$1" -path '*/*/*' -prune -o -type d -exec sh -c 'printf %s\\n "$#"' sh {} +)"
files="$(find "$1" -path '*/*/*' -prune -o -type f -exec sh -c 'printf %s\\n "$#"' sh {} +)"
printf 'Number of directories in %s:\t%s\n' "$1" "$dirs"
printf 'Number of files in %s:\t%s\n' "$1" "$files"
-maxdepth
基本的なデバイスはポータブルではないため、ここで説明した技術を使用しました。