web-dev-qa-db-ja.com

「if」ステートメント内でコマンドを実行し、成功したらさらにステップを実行します

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

これが私が試したものです:ファイル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

ここでの問題は、ディレクトリが存在する場合、プログラムは正常に動作しますが、存在しない場合は作成されますが、プログラムの他の部分に移動します。

4
AshwaraS

エコーは常に成功します。それとサブシェルなしで行います:

#!/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
3
janos
(( 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

追加のヒント:

  • コマンドからエラーを隠すことは悪い考えです。ユーザーは、エラーが権限の拒否、I/Oエラーなどであるかどうかを知る必要があります。ディレクトリが存在しない場合に作成し、ディレクトリがすでに存在する場合に成功するには、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!
1
mikeserv

このアイデアは少し複雑になりますが、これを行うより適切な方法は、スクリプトで適切なテストを利用することです。以下の影響があるもの:

#!/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回目の試行時にのみ入力するように求められます。

0
magamo