mkdirはうまく機能しますが、コピーされません(エラーも発生しません)。
#!/bin/sh
copy_function() {
if $1 $2 $3 $4;then
echo "copied directory and contents"
else
echo "failed"
exit 1
fi
}
copy_function mkdir -p ~/TestFolder/TestFile/
copy_function cp -pr my_data/* /TestFolder/TestFile/
答え1
copy_function() { if $1 $2 $3 $4;then echo "copied directory and contents" else echo "failed" exit 1 fi } copy_function mkdir -p ~/TestFolder/TestFile/ copy_function cp -pr my_data/* /TestFolder/TestFile/
この関数を分解してみましょう。実際には何をしますか?
まず、4つの引数が必要です。この数よりも多くの引数が指定されている場合、最初の4つを除くすべての引数は無視されます。
次に始まる行if
:
最初の4つの位置引数(この関数が受け取った引数)は、次の条件に従って作成します。ファイルをグローバルに展開した後、スペースで単語分割を実行します。次に、結果行をコマンドとして実行します(最初の単語はコマンドとして使用され、残りはコマンドに引数として渡されます)。
より良い方法は、次を使用することです。みんな位置パラメータといいえ追加ファイルのグローバル拡張手順とトークン化を許可する方法は次のとおりです。
if "$@"; then
次の行は、「コピーされたディレクトリとコンテンツ」というメッセージを表示します。この行の問題は、非常に誤解を招くということです。いいえこの機能は何をしますか?この関数は、受け取った最初の引数で表されるすべての操作を実行します。もし私が走るなら、copy_function rm -r -f ~
私はそうでしょう。実際に私のホームディレクトリは削除されていますが、「ディレクトリとコンテンツがコピーされました」という出力メッセージが表示されます。それで、このセリフは嘘です。
次の 2 行は、次のようなことを言おうとするものではないため、else
少なくとも正確です。echo "failed"
何失敗。しかし、理想的には、エラー出力は標準出力ではなく標準エラーに渡されます。
else
echo failed >&2
exit 1
このコマンドは、スクリプト全体をすぐに終了したい場合にスクリプトで使用するのに適しています。代わりに使用する方が良いかもしれませんが、return 1
これは問題です。
大きな問題は完全な機能はまったく意味がありません。
完全にそれを使用するケースは決してありません。
それは何をしますか?それ:
- 使用一部(必ずしも全部ではないが)その主張は、
- グローバルファイル拡張と単語分割を実行するかどうか(わからない場合があります)、
- コマンドで実行
- 次のメッセージを印刷してください。嘘かもしれないコマンドが成功しました
- コマンドが失敗すると、情報がまったくない「Failed」メッセージが表示されます。
これは便利な機能ではありません。
スクリプトは次のように短縮できます。
mkdir -p ~/TestFolder
cp -vpR mydata ~/TestFolder/TestFile
これにはまだ欠点があり、その1つはホームベースのパス(~/TestFolder
)からルートベースのパス(/TestFolder
)に変換することですが、これを修正しました。さらに見知らぬ選択はTestFile
名前です。目次。
ただし、この点に加えて、-v
コピーコマンドを実行するスイッチに注意してください。長い。
また、グローバル拡張ではなく完全なインクルードディレクトリをコピーすると、シェルの「dotglob」オプションの現在の設定に関係なく、隠しファイル(「ドットファイル」とも呼ばれます)がコピーされます。
正しく作成されたシェルスクリプトは次のとおりです。非常に簡潔で非常に強い。ホイールを再発明しないでください。ラッパー関数を追加する前に、使用しているコマンドの機能を理解してください。
読んでくださいウルウィッチカーニバルガイド真剣なスクリプティングを行う計画だったら。