bash - 既に存在 - シェルスクリプト mkdir 失敗




正規のファイルがBashに存在しないかどうかはどうすればわかりますか? (12)

"!"で式を否定することができます:

#!/bin/bash
FILE=$1

if [ ! -f "$FILE" ]
then
    echo "File $FILE does not exist"
fi

関連するマニュアルページはman testか、それと同等にman [ - またはhelp testまたはhelp [組み込みのbashコマンドの場合]です。

私はファイルが存在するかどうかを確認するために次のスクリプトを使用しました:

#!/bin/bash

FILE=$1     
if [ -f $FILE ]; then
   echo "File $FILE exists."
else
   echo "File $FILE does not exist."
fi

ファイルが存在しないかどうかだけをチェックしたい場合は、正しい構文は何ですか?

#!/bin/bash

FILE=$1     
if [ $FILE does not exist ]; then
   echo "File $FILE does not exist."
fi

&&と||を使うと便利なことがあります。 演算子。

のように(あなたはコマンド "テスト"を持っている場合):

test -b $FILE && echo File not there!

または

test -b $FILE || echo File there!

POSIXシェル互換の形式で、以下の1行を好む。

$ [ -f "/$DIR/$FILE" ] || echo "$FILE NOT FOUND"

$ [ -f "/$DIR/$FILE" ] && echo "$FILE FOUND"

私がスクリプトでやっているようないくつかのコマンドについては、

$  [ -f "/$DIR/$FILE" ] || { echo "$FILE NOT FOUND" ; exit 1 ;}

一度これをやり始めると、完全に型付けされた構文を使用することはめったにありません!!


testコマンド( [ここ])には、感嘆符(他の多くの言語に似ています)である論理演算子 "not"があります。 これを試して:

if [ ! -f /tmp/foo.txt ]; then
    echo "File not found!"
fi

Bashファイルテスト

-b filename - 特殊ファイルをブロックする
-c filename - 特殊文字ファイル
-d directoryname - ディレクトリ存在を確認する
-e filename - タイプ(ノード、ディレクトリ、ソケットなど)に関係なく、ファイルの有無を確認します。
-f filename - ディレクトリではない通常のファイルの存在を確認する
-G filename - ファイルが存在し、有効なグループIDが所有しているかどうかを確認します。
-G filename set-group-id - ファイルが存在し、set-group-idの場合は真
-k filename - スティッキービット
-L filename - シンボリックリンク
-O filename - ファイルが存在し、実効ユーザーIDが所有している場合は真
-r filename - ファイルが読み込み可能かどうかを調べる
-S filename - ファイルがソケットかどうかを調べる
-s filename - ファイルが非ゼロサイズであるかどうかを調べる
-u filename - ファイルset-user-idビットが設定されているかどうかを確認します。
-w filename - ファイルが書き込み可能かどうかをチェックする
-x filename - ファイルが実行可能かどうかを調べる

使い方:

#!/bin/bash
file=./file
if [ -e "$file" ]; then
    echo "File exists"
else 
    echo "File does not exist"
fi 

テスト式は、 !を使用して無効にすることができます! オペレーター

#!/bin/bash
file=./file
if [ ! -e "$file" ]; then
    echo "File does not exist"
else 
    echo "File exists"
fi 

あなたはこれを行うことができます:

[[ ! -f "$FILE" ]] && echo "File doesn't exist"

または

if [[ ! -f "$FILE" ]]; then
    echo "File doesn't exist"
fi

ファイルとフォルダの両方をチェックする場合は、 -f代わりに-eオプションを使用します。 -eは、通常のファイル、ディレクトリ、ソケット、文字特殊ファイル、ブロック特殊ファイルなどに対して真を返します。


このシェルスクリプトは、ディレクトリ内のファイルを検索するためにも機能します。

echo "enter file"

read -r a

if [ -s /home/trainee02/"$a" ]
then
    echo "yes. file is there."
else
    echo "sorry. file is not there."
fi

これを行うには3つの異なる方法があります:

  1. 終了ステータスをbashで否定します(他の回答はこれを言っていません):

    if ! [ -e "$file" ]; then
        echo "file does not exist"
    fi
    

    または:

    ! [ -e "$file" ] && echo "file does not exist"
    
  2. テストコマンド内でテストを否定します(これは、これまでにほとんどの回答が表示された方法です)。

    if [ ! -e "$file" ]; then
        echo "file does not exist"
    fi
    

    または:

    [ ! -e "$file" ] && echo "file does not exist"
    
  3. テスト結果が負の場合( &&代わりに|| ):

    のみ:

    [ -e "$file" ] || echo "file does not exist"
    

    これはばかげている(IMO)、あなたのコードがパイプライン否定演算子( ! )を持たないBourneシェル(Solaris 10以前の/bin/shなど)に移植可能でなければ使用しないでください:

    if [ -e "$file" ]; then
        :
    else
        echo "file does not exist"
    fi
    

テストを元に戻すには、 "!"を使用します。 これは、他の言語の "not"論理演算子に相当します。 これを試して:

if [ ! -f /tmp/foo.txt ];
then
    echo "File not found!"
fi

あるいは少し違った方法で書かれています:

if [ ! -f /tmp/foo.txt ]
    then echo "File not found!"
fi

または、次のものを使用できます。

if ! [ -f /tmp/foo.txt ]
    then echo "File not found!"
fi

または、すべてを一緒に見ている:

if ! [ -f /tmp/foo.txt ]; then echo "File not found!"; fi

これは次のように書かれます( "and"演算子:&&を使用して)

[ ! -f /tmp/foo.txt ] && echo "File not found!"

これはこのように短いです:

[ -f /tmp/foo.txt ] || echo "File not found!"

ファイルの存在をテストするために、パラメータは次のいずれかになります。

-e: Returns true if file exists (regular file, directory, or symlink)
-f: Returns true if file exists and is a regular file
-d: Returns true if file exists and is a directory
-h: Returns true if file exists and is a symlink

以下のすべてのテストは、通常のファイル、ディレクトリ、およびシンボリックリンクに適用されます。

-r: Returns true if file exists and is readable
-w: Returns true if file exists and is writable
-x: Returns true if file exists and is executable
-s: Returns true if file exists and has a size > 0

スクリプト例:

#!/bin/bash
FILE=$1

if [ -f "$FILE" ]; then
   echo "File $FILE exists"
else
   echo "File $FILE does not exist"
fi

最も簡単な方法

FILE=$1
[ ! -e "${FILE}" ] && echo "does not exist" || echo "exists"

[[ -f $FILE ]] || printf '%s does not exist!\n' "$FILE"

また、ファイルが壊れたシンボリックリンクや、ソケット、デバイス、FIFOなどの非正規ファイルである可能性もあります。 たとえば、壊れたシンボリックリンクのチェックを追加するには:

if [[ ! -f $FILE ]]; then
    if [[ -L $FILE ]]; then
        printf '%s is a broken symlink!\n' "$FILE"
    else
        printf '%s does not exist!\n' "$FILE"
    fi
fi




scripting