スペースを含む変数でコマンドを正しくテストする方法は?

スペースを含む変数でコマンドを正しくテストする方法は?

テストを作成しようとしていますが、ロジックは次のとおりです。

If mkdir command is successfully executed perform the next actions

私が持っているものは次のとおりです。

FILEPATH=/home/Documents/projectDirectory
CREATE_DIRECTORY=mkdir $FILEPATH

テストコマンド:

if [ -e $FILEPATH ]; then
    echo "${FILEPATH} exists.."
    else 
        #Create the folder: Test it if is created , else exit gracefully.
        if [ -e "${CREATE_COMMAND}" ]; then
        echo "File created ${FILEPATH}"
        else
            echo "Error creating the filePath..exiting.."
            error_exit "Error creating the filePath..exiting.."
        fi
fi

答え1

なぜこれを行うのかはよくわかりませんが、考えられる解決策は次のとおりです。

FILEPATH=/home/Documents/projectDirectory
CREATE_DIRECTORY="mkdir $FILEPATH 2>/dev/null"
eval $CREATE_DIRECTORY
if [[ $? -eq 0 ]]; then
 echo "Directory created"
else
 echo "Directory already exists"
fi

これによりフォルダが作成され、エラーメッセージが表示されずに/ dev / nullに渡されます。その後、ifステートメントは前のコマンドの状態を確認し、成功したことを知らせます(0)。

答え2

現在のコードには次の欠陥があります。

  • CREATE_DIRECTORY=mkdir $FILEPATH:
    1. mkdir $FILEPATH周囲に引用符がないため、そのCREATE_DIRECTORYmkdirのみが保持されます。
    2. $FILEPATH噴射のテーマです。
    3. これらの拡張の最初のトークンが外部コマンドの場合は、CREATE_DIRECTORY結果拡張の環境に変数をエクスポートできます。$FILEPATH
  • [ -e "${CREATE_COMMAND}" ]:
    1. CREATE_COMMAND私たちが知っている限り、この変数には値がありません。文を書きたいと思いますCREATE_DIRECTORY
    2. 成功をテストしませんmkdir

if複合コマンドを使用して、コマンドが成功したかどうかをテストすることもできます。

if command; then
  # Code to execute if command succeeded
else
  # Code to execute if command failed
fi

したがって、コードは次のように書き直すことができます。

FILEPATH=/home/Documents/projectDirectory

if [ -e "${FILEPATH}" ]; then
    echo "${FILEPATH} exists..."
else
    if mkdir "${FILEPATH}"; then
        echo "File created ${FILEPATH}"
    else
        echo "Error creating the filePath..exiting.."
        error_exit "Error creating the filePath..exiting.."
    fi
fi

気づく:

  1. CREATE_DIRECTORYこの変数は必須ではありません。
  2. [ -e "${CREATE_COMMAND}" ]に置き換えられますmkdir "${FILEPATH}"

答え3

なぜこれができないのか本当に理解できません。

dir='/home/Documents/projectDirectory'

if ! mkdir "$dir"; then
    printf 'Something went wrong when trying to create "%s"\n' "$dir" >&2
    exit 1
fi

printf '"%s" created, now doing other things...\n' "$dir"

mkdirすでに存在する場合、$dir呼び出しは失敗します。

ディレクトリの存在を許可し、mkdir作成が失敗した場合にのみ終了する必要がある場合は、上記の呼び出しに-p追加するmkdirか、ディレクトリの存在について明示的なテストを実行します。

dir='/home/Documents/projectDirectory'

if [ ! -d "$dir" ]; then
    if ! mkdir "$dir"; then
        printf 'Something went wrong when trying to create "%s"\n' "$dir" >&2
        exit 1
    fi

    printf '"%s" created\n' "$dir"
fi

echo 'now doing other things...'

私はそれがディレクトリであるかどうかを-dテストするためにここでテストを使用しています。$dir私はスクリプトの残りの部分で名前が単純なもの以上でなければならないと思ったので、これをしました。存在するただし、これは物理ディレクトリを表します。


コマンドを変数に保存しようとしないでください。そうしなければならない場合はほとんどありません。これは入力時間を節約する良い方法ではありません。シェルスクリプトで何かを行うために短い方法が必要な場合は、そのためのシェル関数を作成します。

また、習慣を育ててください。いつも変数拡張を二重引用符で囲みます。これにより、シェルスクリプトは常にスペースを含むファイル名を正しく処理し、ファイル名のグロービングが誤って呼び出されるのを防ぎます。

関連:


他のもの:

CREATE_DIRECTORY=mkdir $FILEPATH

これはその環境でコマンドとして実行されます$FILEPATH。ディレクトリ(存在する場合)または少なくともコマンドではないCREATE_DIRECTORY=mkdirため失敗します。$FILEPATH

値にスペースを含む変数を生成するには、値を引用します。

ライン

if [ -e "${CREATE_COMMAND}" ]; then

〜するいいえディレクトリを作成します。 inの値が$CREATE_COMMANDファイル階層の名前と一致するかどうかをテストします。

それが何であるかはわかりませんが、おそらく単におよび/または同様の略語ですerror_exit。そうですか?echoexit 1

関連情報