プロンプトから提供された完全なパスに基づいてディレクトリを作成するプログラムを実行しようとしていました。ディレクトリがすでに存在する場合は、エラーが返され(「ディレクトリはすでに存在します」)、再度要求されます。再帰関数の名前。
これが私が試したものです:ファイルtest1
初期化:
#!/bin/bash
echo "enter the directory name"
read ab
check(){
if (( echo `mkdir $ab` 2>/dev/null )); then
echo "directory created "
echo `ls -ld $ab`
exit
else
echo "try again "
echo "enter new value for directory:"
read ab
check
fi
}
check
ここでの問題は、ディレクトリが存在する場合、プログラムは正常に動作しますが、存在しない場合は作成されますが、プログラムの他の部分に移動します。
エコーは常に成功します。それとサブシェルなしで行います:
#!/bin/bash
echo "enter the directory name"
read ab
check(){
if mkdir "$ab" 2>/dev/null; then
echo "directory created "
ls -ld "$ab"
exit
else
echo "try again "
echo "enter new value for directory: "
read ab
check
fi
}
check
(( echo `mkdir $ab` 2>/dev/null )) bash: ((: echo 2>/dev/null : syntax error in expression (error token is "2>/dev/null ")
二重括弧は 算術式 を囲みます。あなたが意図したものに近いことを何もしないそのコマンド。 mkdir $ab
は標準出力に何も書き込まないため、`mkdir $ab`
は空の文字列であるため、算術式の内容はecho 2>/dev/null
です。ここでの>
記号は「より大きい」演算子であり、echo
は変数名です。算術式は構文的に正しくありません(変数の後にリテラル整数を続けることはできません)。コマンドは構文的に正しくないため、エラーステータスが返され、else
ブランチが実行されます。
コマンドの戻りステータスをテストするには、そのコマンドを記述します。
if mkdir -- "$ab" 2>/dev/null
追加のヒント:
mkdir -p -- "$ab"
を使用します。ab
の値がダッシュで始まる場合、それはオプションとして解釈されます。オプションの終わりを示すには、最初に--
を置きます。tries=0
while [ "$((tries+=1))" -le 5 ] || ! break
printf 'enter dirname: > '
IFS= read -r dir &&
if ! mkdir -- "$dir"
then echo try again
else ! echo Success\!
fi
do :; done
なぜあなたがそのような終了ステータスを否定したいのかはわかりませんが、私は上記があなたが探している反転のようなものを得るはずだと思います-そして、それは限られた数の$tries
の後に終了するはずです。
実行したら...?
enter dirname: > .
mkdir: cannot create directory ‘.’: File exists
try again
enter dirname: > .
mkdir: cannot create directory ‘.’: File exists
try again
enter dirname: > .
mkdir: cannot create directory ‘.’: File exists
try again
enter dirname: > .
mkdir: cannot create directory ‘.’: File exists
try again
enter dirname: > .
mkdir: cannot create directory ‘.’: File exists
try again
そしてまた...
enter dirname: > doesntexist
Success!
このアイデアは少し複雑になりますが、これを行うより適切な方法は、スクリプトで適切なテストを利用することです。以下の影響があるもの:
#!/bin/bash
if [[ -n $1 ]]; then
dirname=$1
fi
if [[ -z $dirname ]]; then
echo "Enter directory name."
read dirname
fi
check() {
if [[ -d "$dirname" ]]; then
echo "Directory already exists."
echo "Enter new directory name."
read dirname
check
Elif [[ -e "$dirname" ]]; then
echo "$dirname already exists, but is not a directory."
echo "Enter new directory name."
read dirname
check
else
if mkdir -p -- "$dirname"; then
echo "Directory created"
ls -ld "$dirname"
fi
exit
fi
}
check
これにより、実行した呼び出し(mkdir)からのエラーメッセージが保持され、試行が失敗した理由に関するフィードバックを提供するためにいくつかの有用なテストが実行されます。さらに、オプションで目的のディレクトリ名をコマンドライン引数として渡すことができ、2回目の試行時にのみ入力するように求められます。