linux - bashの場合、コマンドが実行されるかどうかを確認する

原文 linux bash shell if-statement mkdir

私はbashプログラミングの初心者です。プロンプトから提供された完全なパスに基づいてディレクトリを作成するプログラムを実行しようとしました。ディレクトリがすでに存在する場合は、ディレクトリがすでに存在する場合にエラーを返し、再帰関数で名前を再度要求します。
ここで私がやったことです

ファイル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


ここでの問題は、ディレクトリが存在する場合、プログラムは正常に動作しますが、存在しない場合は作成されますが、プログラムの他の部分に移動します。助けてください
答え
testを使用して、ディレクトリが存在するかどうかを確認できます。取得するまで繰り返しディレクトリ名を要求する場合は、ループを使用します。

while true
do
    read -p"Directory Name: " directory
    if [[ -d $directory ]]     # Directory already exists
    then
        echo "Directory '$directory' already exists. Try again."
        continue
    fi
    mkdir "$directory" && break

    echo "Cannot create directory $directory"
    exit 2             # Or whatever
done


while trueループは無限ループです。ただし、ループには2つのループコントロールがあります。ループの先頭に戻るcontinueステートメントと、ループを終了するbreakステートメントです。そのため、その無限ループ(すべての無限ループと同様)は実際には無限ではありません。

[[ -d "$directory" ]]を使用して、ディレクトリがすでに存在するかどうかをテストします。すでに存在している場合は、その効果をエコーし​​、continueを使用して戻り、ディレクトリ名の入力を求めます。

read-pパラメータを使用していることに注意してください。これは、readコマンドで使用する私のプロンプトです。これは、読み取りとプロンプトを組み合わせる簡単な方法です。

mkdir "$directory" && breakはディレクトリを作成することを意味します。 &&はリスト演算子です。左側(mkdir)でコマンドを実行し、成功した場合(つまり、ゼロの終了ステータスを返す)、右側(break)でコマンドを実行し、ループを終了します。これは次と同等です。

If mkdir "$directory"
then
    break
fi


もう1つのリスト演算子は||です。左側のコマンドが失敗した場合(ゼロ以外の終了ステータスを返した場合)は、右側のコマンドを実行します。

例えば:

[[ -d $directory ]] || mkdir "$directory"


以下と同等です。

if [[ ! -d $directory ]]
then
    mkdir "$directory"
fi


ここでは、さまざまなシェルスクリプトで表示される多くの標準的なことを説明するために、目的を説明します。


テストには[[ ... ]]を使用します。ファイル、ディレクトリ、文字列、ブールテストのさまざまなテストが多数あります。それらを学ぶ。
読み取りプロンプトには-pを使用します。
さまざまなリスト演算子を使いこなしてください。
continueおよびbreakを介してループを制御する方法を理解します。このようなループを使用して、正しいパラメーターが入力されていることを確認するのは珍しいことではありません。
関連記事

java - Linuxでtess4jを使用してWebアプリケーションをデプロイする

linux - アプリケーション用のUbuntuカーネルモジュール

mysql - QT 5.3.2 linux libmysqlclient

linux - 1つのbashスクリプトで複数のfind -execコマンドが機能しない

linux - Linuxカーネルを再コンパイルする必要はありますか?

linux - 誤って削除した後、hostsファイルを取り戻す方法[終了]

php - CentOSにPHP FileInfoモジュールをインストールする方法

python - 2番目のスクリプトが実行中か、すでに終了しているかを確認します

c++ - openmp parallelセクションのベンチマーク

linux - opensslのコンパイルが「/ usr / bin / ld:cannot find -lz」で失敗する