
テストを作成しようとしていますが、ロジックは次のとおりです。
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
:mkdir $FILEPATH
周囲に引用符がないため、そのCREATE_DIRECTORY
値mkdir
のみが保持されます。$FILEPATH
噴射のテーマです。- これらの拡張の最初のトークンが外部コマンドの場合は、
CREATE_DIRECTORY
結果拡張の環境に変数をエクスポートできます。$FILEPATH
[ -e "${CREATE_COMMAND}" ]
:CREATE_COMMAND
私たちが知っている限り、この変数には値がありません。文を書きたいと思いますCREATE_DIRECTORY
。- 成功をテストしません
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
気づく:
CREATE_DIRECTORY
この変数は必須ではありません。[ -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
。そうですか?echo
exit 1