シェルLinuxスクリプトを書く。 スクリプトはただ

私たちはあなたのbashの知識がゼロに等しいかゼロに近いと仮定するbashスクリプトのチュートリアルを紹介します。 この記事の助けを借りて、bashスクリプトを作成することは非常に簡単であることをあなたは理解するでしょう。 ただし、この記事でまだすべての質問に対する回答が見つからない場合(またはその他の理由でサードパーティの情報源の助けが必要な場合)は、当社の管理者に直接お問い合わせください。

それでは、Bashコマンドシェルについて学びましょう。
簡単な "Hello World"スクリプトを使ってトレーニングを始めましょう。

1. Hello World bashスクリプト
  まず翻訳者がどこにいるのかを知る必要があります。 これを行うには、次のコマンドを入力します。
  $ bash
お気に入りのテキストエディタを開き、hello_world.shというファイルを作成します。 このファイルに次の行を保存します。
  #!/ bin / bash#STRING型の変数を宣言するSTRING = "Hello World"#画面に変数を表示するecho $ STRING
備考このチュートリアルの各bashスクリプトは、コメントとして解釈されない "#!"文字のシーケンスで始まります。
ファイルhello_world.shを保存したディレクトリに移動し、このファイルを実行可能にします。
  $ chmod + x hello_world.sh
さて、今あなたはあなたの最初のbashスクリプトを作成する準備ができています:
  ./hello_world.sh

2.バックアップ用の単純なbashスクリプト
  #!/ bin / bash tar -czf myhome_directory.tar.gz / home / linuxconfig

3.変数
この例では、単純なbash変数を宣言し、それをechoコマンドで表示します。
  #!/ bin / bash STRING = "HELLO WORLD !!!" echo $ STRING
バックアップと変数のスクリプト:
  #!/ bin / bash OF = myhome_directory _ $(日付+%Y%m%d).tar.gz tar -czf $ OF / home / linuxconfig

3.1。 グローバル変数とローカル変数
  #!/ bin / bash#グローバル変数の宣言#この変数はグローバルで、スクリプト内の任意の場所で使用できますVAR = "global variable" function bash(#ローカル変数の宣言#この変数はローカルで、この関数bash local VARでのみ使用できます = "ローカル変数" echo $ VAR)echo $ VAR bash#グローバル変数は変更されていないことに注意してください。# "local"はbashでの予約語です。echo $ VAR

4.引数をBashスクリプトに渡す
#!/ bin / bash#渡された引数にアクセスするために前に定義された変数を使用する#渡された引数にアクセスする#screen arguments echo $ 1 $ 2 $ 3 " - \u003e echo $ 1 $ 2 $ 3"#bashコマンドラインから引数を特別な配列に保存できます。 ( " [メール保護]")#シェルへの引数のエコーecho $(args)$(args)$(args)" - \u003e args =( " [メール保護]")echo $(args)$(args)$(args)"#use [メール保護]  すべてのエコー引数を一度に出力する [メール保護]  " - \u003e echo [メール保護]"##bashスクリプトに渡された変数の数を表示するために$#変数を使用します。echo渡された引数の数:$#" - \u003e echo渡された引数の数:$# "/arguments.sh Bashスクリプトのチュートリアル

5. bashでシェルコマンドを実行する
  #!/ bin / bash#シェルコマンドを実行するのに "` `"バッククォートを使用するecho `uname -o`#クォートなしで呼び出されるbashコマンドecho uname -o

6.ユーザ入力を読む
  #!/ bin / bash echo -e "こんにちは、単語を入力してください:\\ c" echoという単語を読む入力した単語は次のとおりです。$ "echo -e" 2つの単語を入力できますか? "word1 word2 echo" \\ "$ word1 \\" \\ "$ word2 \\" "echo -e" bashスクリプトについてどう思いますか? "#readコマンドはデフォルト変数$ REPLYに対する答えを保存しますread echo"あなたは$ REPLYと言いました、私は 「それを聞いてうれしい! "echo -e"好きな色は? "#-aはreadコマンドがread -a colors echo配列に複数の値を格納することを可能にします。"私のお気に入りの色も$(colors)、$(colors)、$(colors)です:-) "

7. bash trapコマンド
  #!/ bin / bash#trap trap bashtrap INTコマンド#bash-screen-clearコマンドclear; #bash trap機能はCTRL-Cが押されたときに実行され、bashはメッセージを表示する=\u003e bash trapを実行中! bashtrap()( "Ctrl + Cが検出されました!... bash trapを実行しています!")#seq 1 10のaの1/10から10/10までの値。 "終了するには$ a / 10"とエコーしてください。 1を眠る。 「Bash Trapの例を終了します!!!」と表示されます。

8.アレイ
8.1。 単純なbash配列を宣言する
  #!/ bin / bash#3つの要素からなる配列を宣言するARRAY =( "Debian Linux" "Redhat Linux" " Ubuntu Linux")#配列の要素数を取得するELEMENTS = $(#ARRAY [@])#与えられた範囲の数の要素に対して、配列の各要素を出力する((i = 0; i)

8.2。 ファイルをbash配列にインポートする
  #!/ bin / bash#declare -a ARRAY配列宣言#出力ファイル記述子10をstdin exec 10に宣言

出力付きファイル実行への出力付きbashスクリプトの実行:
linuxconfig.org $ cat bash.txt bashスクリプトチュートリアルガイドlinuxconfig.org $ ./bash-script.sh bash.txtエレメント数:4 Bashスクリプトチュートリアルガイドlinuxconfig.org $

9. if / else / fiでスクリプトをbashする
9.1。 if / else付きの単純なBash式
[と]の中のスペースに注意してください。 これらのスペースがないと、スクリプトは機能しません。
  #!/ bin / bash directory = "./ BashScripting"#[ - d $ directory]の場合、bashはディレクトリの存在を確認します。 「ディレクトリが存在します」とエコーし、「ディレクトリは存在しません」とエコーします。

9.2。 組み込みif / else
  #!/ bin / bash#選択した変数を宣言し、それに値4を割り当てます。4 choice = 4#stdout echo "1"に出力します。2.スクリプト "echo" 3.チュートリアル "echo -n"単語を選択してください。 #変数が4の間ループを繰り返す#while [$ choice -eq 4]; #入力された値を読み込みます#選択を読み込みます#bashがネストされている場合/ else if [$ choice -eq 1]; それから[$ choice -eq 2]の場合は "あなたは単語を選択しました:Bash"をエコーし​​ます。 それから、[あなたが選んだ単語:スクリプトを書いています]とエコーして、[$ choice -eq 3]; 次に「あなたは単語を選択しました:チュートリアル」または「もう1〜3の間で選択してください」とエコーします。 echo "1. Bash" echo "2.スクリプト" echo "3.チュートリアル" echo -n "単語を選択してください。" choice = 4 fi fi fi done

10.バッシュ比較
10.1 算術比較
-lt -gt\u003e -le -ge\u003e =
-eq ==
-ne!=

  #!/ bin / bash#整数変数の宣言NUM1 = 2 NUM2 = 2 if [$ NUM1 -eq $ NUM2]; それから "両方の値が等しい"とエコーする "エコー"値と等しくない "fi

  #!/ bin / bash#整数変数の宣言NUM1 = 2 NUM2 = 1の場合[$ NUM1 -eq $ NUM2]; それから "両方の値が等しい"とエコーする "エコー"値と等しくない "fi

  #!/ bin / bash#整数変数の宣言NUM1 = 2 NUM2 = 1の場合[$ NUM1 -eq $ NUM2]; 次に、「両方の値が等しい」とエコーします。elif [$ NUM1 -gt $ NUM2]; エコー "NUM1はNUM2より大きい"それ以外の場合エコー "NUM2はNUM1より大きい" fi

10.2。 文字列比較
=等しい
!=等しくない
\u003eより大きい
-n s1 string s1は空ではありません
-z s1文字列s1が空です

  #!/ bin / bash#文字列宣言S1 S1 = "Bash"#文字列宣言S2 S2 = "スクリプティング" if [$ S1 = $ S2]; それから "両方の文字列が等しい"とエコーする "エコー"文字列が等しくない "fi

  #!/ bin / bash#文字列宣言S1 S1 = "Bash"#文字列宣言S2 S2 = "Bash" if [$ S1 = $ S2]; それから "両方の文字列が等しい"とエコーする "エコー"文字列が等しくない "fi

11. bashファイルチェック
-b filename - ファイルをブロックします
-c filename - ファイルにスペシャルが含まれています。 キャラクター
-d directoryname - ディレクトリの存在を確認する
-e filename - ファイルの存在を確認します
-f filename - 非ディレクトリの存在を確認する
-GnameファイルがグループIDかどうかを確認します。
-g filename fileが存在し、かつset-group-idであれば真。
-k filenameスティッキービット
-L filenameシンボリックリンク
ファイルがユーザーIDの場合、-O filenameはtrueです。
-r filename - ファイルの可用性を確認します
-S filenameファイルがソケットかどうかを調べる
-s filename - ファイルサイズがゼロより大きいことを確認します
-u filenameファイルset-ser-idビットが設定されているか確認します
-w filename - ファイルの上書きをチェックします
-x filename - ファイルの実行を確認します
  #!/ bin / bash file = "./ file" if [-e $ file]; それから "File存在しない"エコー "File存在しない"エコー
同様に、whileループを使用してファイルの存在を確認することもできます。 このスクリプトはファイルが存在する限り機能しません。 bash否定演算子 "!"に注意してください。これは、関数-eを否定します。
  #!/ bin / bashしながら[! -e myfile]; do#ファイルが作成され、存在している間は反応しません。

12.サイクル
12.1。 バッシュループコマンド
  #!/ bin / bash#$(ls / var /)内のfのbashループ。 $ fをエコーする
bashコマンドラインからループを実行します。
  $(ls / var /)におけるfの$。 $ fをエコーする。 終わった

12.2。 繰り返しループ
  #!/ bin / bash COUNT = 6#while [$ COUNT -gt 0]の間、bashループ。 $ COUNTをエコーし​​てCOUNT = COUNT-1を実行させる

12.3。 サイクルまでバッシュ
  #!/ bin / bash COUNT = 0#[$ COUNT -gt 5]までのbashサイクル。 $ COUNTをエコーし​​てCOUNT = COUNT + 1を実行させる

12.4。 bashループを制御する
以下は標準入力によって制御されるwhileループの例です。 STDOUTからSTDINおよびreadコマンドへの遷移がある限り、bash whileループは機能します。
  #!/ bin / bash#このbashスクリプトは、ファイル名DIR = "。"の中で#スペースを見つけて置き換えます。 #whileループ内でSTDOUTを#STDINにリダイレクトすることによって、bash readコマンドでループを制御します。 検索コマンド  スペースを含むファイル名は破棄されません。 ファイルの読み込み中 #[["$ file" = * [[::]] *]];#POSIXクラス[:space:]を使用してファイル名の中のスペースを検索します。 #スペースを "_"文字に置き換えて、mvファイルの名前を "$ file"に変更します。 tr "" "_" `fi; #whileループの終了

13. bash関数
#!/ bin / bash#bash関数は任意の順序で宣言できます。function function_B(echo関数B)関数function_A(echo $ 1)関数function_D(echo関数D)function function_C(echo $ 1)#関数呼び出し#パス関数パラメーターA function_A「機能A」 function_B#パス・パラメーター関数C function_C "関数C" function_D

バッシュの選択
  #!/ bin / bash PS3 = "単語を1つ選択してください:"# "linux"内の選択単語の選択 "bash" "スクリプティング" "チュートリアル" do echo "選択した単語は次のとおりです。 それは無限に終了して終了します0

15.切り替え
  #!/ bin / bash echo "お好きなプログラミング/スクリプト言語は何ですか" echo "1)bash" echo "2)perl" echo "3)python" echo "4)c ++" echo "5)わかりません! 「 ケースを読む。 #単純なbash条件の構造#注意:この場合、$ caseは変数であり、ここではそのように呼ばれる必要はありません。 2) "あなたはperlを選択しました"とエコーします。 3) "Pythonを選択しました"とエコーします。 4) "c ++を選択しました"とエコーします。 5)esacを終了する

16. Bashでの引用
引用符はbashおよびbashスクリプトの重要な要素です。 以下に、bashで引用符を使用するためのいくつかの基本事項があります。
16.1。 スクリーニング 特殊文字
引用符を使い始める前に、特殊文字をエスケープする方法を学ぶ必要があります。 この手続きにより、bashはこれらの文字の意味を直接認識することができます。 これを行うには、バックスラッシュ "\\"を使用する必要があります。 例えば、
  #!/ bin / bash#文字列型の変数のbash宣言BASH_VAR = "Bash Script"#変数の出力echo $ BASH_VAR#特殊文字 "$"が "\\"記号でエスケープされている場合、バックスラッシュでecho \\ $ BASH_VAR#で直接認識できます 特別な意味もあり、それは別のスラッシュ "\\" echo "\\\\"で解決できます。

16.2。 一重引用符
bash内の一重引用符は、すべての特殊文字の値をエスケープします。 したがって、特殊文字は文字通りに認識されます。 この場合、たとえ片方がバックスラッシュでエスケープされていても、2つの同じ引用符の中に単一引用符を使用することはできません。
  #!/ bin / bash#文字列型の変数のbash宣言BASH_VAR = "Bash Script"#変数の出力BASH_VAR echo $ BASH_VAR#仕様の値。 bash内の文字は一重引用符を使ってエスケープされますecho "$ BASH_VAR" $ BASH_VAR ""

16.3。 二重引用符
二重引用符は、 "$"、 "\\"、および "` "を除くすべての特殊文字をエスケープするためにbashで使用されます。 他のすべてのスペシャル 文字は文字通りに認識されます。 前の段落とは異なり、一重引用符は二重引用符の内側で使用できます。 二重引用符の間に別の二重引用符を使用する必要がある場合は、バックスラッシュ「\\」を使用して文字通りbashにそれらを認識させることができます。 例えば、
  #!/ bin / bash#文字列型の変数のbash宣言BASH_VAR = "Bash Script"#エコー変数BASH_VAR echo $ BASH_VAR#spec。 二重引用符を "$"、 "\\"、および "` "echo"と一緒に使用すると、文字とその値はエスケープされます。#バックスラッシュを使用して$ BASH_VARと\\ "$ BASH_VAR \\"になります。

16.4。 バッシュシールドANSI-C
ちなみに、ANSI-Cという別の種類のスクリーニングもあります。 このタイプのシールドを使用する場合、バックスラッシュ「\\」でマークされた文字は、ANSI-C規格に従って特別な意味を持ちます。
警告(ベル)
\\ bバックスペース
\\ eエスケープ文字
\\ fフォームフィード
\\ n改行
キャリッジリターン
水平タブ
垂直タブ
\\\\バックスラッシュ
シングルクォート
\\ nnn文字の8進数(参照)
\\ xnn文字の16進値(を参照)

ansi-c bash-shieldingの指定:$ "" 例:
  例では#!/ bin / bash#、新しい行には\\ n、16進値には\\ x40、8進値には\\ 56を使用しました。 echo $ "web:www.linuxconfig.org \\ nemail:web \\ x40linuxconfig \\ 56org"

17.算術演算
17.1。 bashを使った追加の例
  #!/バイナリ -i RESULT2; RESULT2 = $ 1 + $ 2 "echo $ 1 + $ 2 = $(($ 1 + $ 2))" - \u003e#$(($ 1 + $ 2)) "と宣言します。

17.2。 バッシュ演算
#!/ bin / bash echo "#let#"#bashの加算ADDITION = 3 + 5 echo "3 + 5 =" $ ADDITION#bash減算let SUBTRACTION = 7-8 echo "7 - 8 =" $ SUBTRACTION#bash 乗算MULTIPLICATION = 5 * 8エコー "5 * 8 =" $ MULTIPLICATION#bash除算DIVISION = 4/2エコー "4/2 =" $ DIVISION#bash係数letモジュール= 9%4エコー "9%4 =" $ MODULUS#bashの累乗法POWEROFTWO = 2 ** 2 echo "2 ^ 2 =" $ POWEROFTWO echo "#Bash算術展開#"#算術式には2つの形式があります。$ [expression]#と$((expression# )) - あなたはもっと好きなものを選択することができます4 + 5 = $((4 + 5))echo 7 - 7 = $ [7 - 7] echo 4 x 6 = $(((3 * 2))echo 6/3 = $((6/3))echo 8%7 = $((8%7))echo 2 ^ 8 = $ [2 ** 8] echo "#宣言#" echo -e "2つ入力してください 数字\\ c "#cc認識 num1 num2宣言を読みます-i result = $ num1 + $ num2 echo "結果:$ result"#bash 2進数を変換する10001 result = 2#10001 echo $ result#bash変換する8進数16 result = 8#16 echo $ result #bash変換16進数0xE6A結果= 16#E6Aエコー$結果

17.3。 浮動小数点丸め
  #!/ bin / bash#浮動小数点数の取得floating_point_number = 3.3446 echo $ floating_point_number#$内のbash_rounded_numberの浮動小数点数をbashで丸めます(printf%.0f $ floating_point_number); "bashで丸められた数:"をエコーし​​なさい:$ bash_rounded_number完了

17.4。 bash浮動小数点計算
  #!/ bin / bash#bashでの単純なlinux計算機の実装echo "入力を入力してください:" read userinput#小数点以下2桁で結果を出力します。echo "小数点以下2桁の結果:" echo "scale = 2; $(userinput) )」 bc#は小数点以下10桁で結果を表示します。echo "小数点以下10桁で結果:" echo "scale = 10; $(userinput)" | bc#は、丸め整数エコーとして結果を出力します。 "丸め整数としての結果:" echo $ userinput | bc

18.リダイレクト
18.1。 STDERRのbashスクリプトからのSTDOUT
  #!/ bin / bash echo "このSTDOUTをSTDERRにリダイレクト" 1\u003e&2
STDERRでSTDOUTリダイレクトを確認するには、スクリプトの出力をファイルにリダイレクトします。

18.2。 bashスクリプトからSTDOUTへのSTDERR
  #!/ bin / bash cat $ 1 2\u003e&1
STDERR i STDOUTリダイレクトを確認するには、スクリプトの出力をファイルにリダイレクトします。

18.3。 画面上の標準出力
STDOUTをリダイレクトする簡単な方法は、デフォルトでSTDOUTが自動的に画面に表示されるため、単純に任意のコマンドを使用することです。 しかし、最初にファイル "file1"を作成してください。
  $ touch file1 $ lsファイル1ファイル1
上の例からわかるように、lsコマンドの実行はSTDOUTを呼び出します。これはデフォルトで画面に表示されます。

18.4。 ファイルへの標準出力
STDOUTのデフォルトの動作をブロックするために、 "\u003e"を使って出力をファイルにリダイレクトすることができます。
  $ ls file1\u003e STDOUT $ cat STDOUTファイル1

18.5。 ファイルへの標準エラー出力
デフォルトでは、STDERRは画面に表示されます。
  $ ls file1 STDOUT $ ls file2 ls:file2にアクセスできない:そのようなファイルまたはディレクトリはありません
次の例では、標準エラー(stderr)をファイルにリダイレクトし、デフォルトでは標準出力を画面にリダイレクトします。 STDOUTが画面に表示され、STDERRがSTDERRという名前でファイルに書き込まれることに注意してください。
  $ ls file1 STDOUT $ ls file1 file2 2\u003e STDERRファイル1 $ cat STDERR ls:ファイル2にアクセスできない:そのようなファイルまたはディレクトリはありません

18.6。 STDOUTからSTDERRへ
STDOUTとSTDERRを1つのファイルにリダイレクトすることも可能です。 次の例では、STDOUTをSTDERRと同じ記述子にリダイレクトします。 STDOUTとSTDERRの両方がファイル "STDERR_STDOUT"にリダイレクトされます。
  $ ls file1 STDERR STDOUT $ ls file1 file2 2\u003e STDERR_STDOUT 1\u003e&2 $ cat STDERR_STDOUT ls:ファイル2にアクセスできない:そのようなファイルまたはディレクトリfile1はありません
これで、ファイルSTDERR_STDOUTにSTDOUTとSTDERRの両方が含まれました。

18.7。 STDERRからSTDOUTへ
上記の例は、STDERRをSDTOUTと同じ記述子にリダイレクトするように変換できます。
  $ ls file1 STDERR STDOUT $ ls file1 file2\u003e STDERR_STDOUT 2\u003e&1 $ cat STDERR_STDOUT ls:ファイル2にアクセスできない:そのようなファイルまたはディレクトリfile1はありません

18.8。 ファイルへのSTDERRおよびSTDOUT
上の例はどちらもSTDOUTとSTDERRをファイルにリダイレクトします。 同じ効果を得るための別の方法があります。
  $ ls file1 STDERR STDOUT $ ls file1 file2&\u003e STDERR_STDOUT $ cat STDERR_STDOUT ls:ファイル2にアクセスできない:そのようなファイルまたはディレクトリfile1はありません
または
  ls file1 file2\u003e&STDERR_STDOUT $ cat STDERR_STDOUT ls:ファイル2にアクセスできない:そのようなファイルまたはディレクトリfile1はありません

この記事は、記事のアマチュア翻訳です。

初心者システム linux管理者  遅かれ早かれ「」のようなことに直面しました。 台本"、のようなブートスクリプトの1つにしてください。 /etc/rc.d/rc  またはソフトウェア開発者によって書かれた設定スクリプト 構成する。 この記事では、スクリプトの記述方法について説明します。 シェル Linuxの世界では初心者でも普通のものから抜け出したものではなく、非常に有能です。

私たちが英語の用語の背後にあるものを理解しているという事実から始めましょう。 シェルそして 台本. シェルあるいはシェルは、この用語が時々翻訳されるように、コマンドインタプリタ、ユーザーとオペレーティングシステムの間のインターフェース、そのコアです。 しかし、これ以外にも強力なプログラミング言語とスクリプトです。 それはそれ自身の公式の言葉と制御構造を含み、あなたがそれにプログラムを書くことを可能にします。 このようなスクリプトプログラムは スクリプトシステムコールとコマンドを組み合わせることができます オペレーティングシステム外部のユーティリティと同様に、システム管理のための強力なツールを作成します。

システム管理のタスクの1つは バックアップする  重要な情報 したがって、バックアップ情報を実装するスクリプトの例を考えてみましょう。

はじめに

したがって、まず最初に、スクリプトの構造を理解する必要があります。 大したことではありません。 概して、最も単純なスクリプトは単なるシステムコマンドのリストです。 例えば、

エコーこれはほんの一例です
おふみ
うなめ-a

これらのコマンドは1つのファイルにまとめられています。 しかしシェルは、その内容を読み取るだけでなく、このファイルを処理する必要があることを認識している必要があります。 これは特別なデザインです:#!

このデザインは "と呼ばれています シャバン" 実際には、#はコメントを設定しますが、この場合、sha-bangはスクリプトハンドラへのパスが続くことを意味します。 例えば、

  #!/ bin / bash
#!/ bin / sh
#!/ usr / bin / perl

Bash、Bourne-Againシェルに焦点を当てます。 このシェルは、ほとんどすべてのLinuxシステムにデフォルトでインストールされており、/ bin / shがそれを参照します。 スクリプトの最後にservice word exitと書かれています。

この知識を持って、最初のスクリプトを書きます。

  #!/ bin / bash
echo簡単なスクリプトechoコマンドはメッセージを表示します。
あなたをエコーする:
whoami#whoamiは登録ユーザーの名前を示します
システムが起動しました
uptime#uptimeは時間通りにマシンの電源を表示します
今日エコー
date#dateは現在の日付と時刻を示します
反響しながら
出口

このファイルをtutor1.shとして保存します。 コマンドを実行してスクリプトを実行可能にします。

Chmod + rx tutor1.sh

スクリプトの結果は次のようになります。

[メール保護]:〜/ Doc /オープンソース$ ./tutor1.sh
簡単なスクリプト
あなた:
ヴォランド
システムが起動しました
14:38:46アップ1:48、2ユーザー、ロード平均:0.47、0.43、0.41
今日
2006年2月26日14時38分46秒MSK
さようなら

私たちはもっと真剣に向きを変えます。

簡単なスクリプトの書き方を学んだので、今度は深刻なことに移ります。バックアップ用のスクリプトを書くことです。

まず最初に、あなたが定義する必要があります - バックアップコピー  私たちは何をするつもりですか したがって、私たちのスクリプトはコマンドラインで動作できるはずです。 コマンドライン引数は、スクリプト名の後にスペースで区切って指定します。somescript arg1 arg2 arg3。 スクリプトはそれらのシーケンス番号に従って引数を取るので、$ number_argumentの形式の構成を使います。 1ドル、2ドル、3ドル。 $は、変数を扱うときに必要となるワイルドカード文字です。 スクリプト内の変数は、variable_name = valueとして指定されます。 MAXPARAMS変数を使用して、コマンドラインパラメータの最大数、アーカイブの名前を設定するBACKUPFILE、バックアップするフォルダのBACKUPDIR、およびアーカイブを保存するフォルダのARCHIVEDIRを使用します。 スクリプトの最も重要な部分は、指定された場所で見つかったすべてのファイルとフォルダを検索してアーカイブするためのコマンドです。

見つけます。 -type f -print0 | xargs -0 tar rvf "$ archive.tar"\u003e / dev / null
gzip $ archive.tar

これらのコマンドが何をするのか見てみましょう。 findはすべてのファイルのカレントディレクトリ(これは最初の "。"引数で示されます)を検索し、それらへのフルパス(print0)を返します。 これらのパスは、すべてのファイルを1つにまとめるtarコマンドにリダイレクトされます。 次に、gzipコマンドを使用して、結果のtarファイルをアーカイブします。 チーム \u003e / dev / null  大量のファイルをアーカイブしている場合に便利です。 この場合、それらの名前とそれらのフルパスはコンソールに表示されません。

次のステップは、ユーザーが間違いを犯した場合にスクリプトを使用する方法についてのヒントをユーザーに提供することです。

たとえば、この構造

[$#-lt "$ MAXPARAMS"];の場合
それから
反響する

反響する
0番出口
fi

ユーザーが十分な数のコマンドライン引数を指定していないことがわかります。 [条件]…fiの場合  条件付き構造を設定します。 $#-lt "$ MAXPARAMS"  入力されたパラメータの数をチェックし、この数がMAXPARAMSより小さい場合、ユーザーは誤った入力に関するメッセージを受け取ります。 終了0を指定すると、エラーコードを指定せずにスクリプトを強制的に停止させます。 同様に、lsではなく許容される数を超えたパラメータがチェックされます(より小さい - より小さい)、gt(より大きい - より大きい)を指定する必要があります。 スクリプトの要点が明確になったので、フルバージョンに進むことができます。

  #!/ bin / bash
説明:
#+指定したディレクトリ内のすべてのファイルをバックアップします。
# "tarball"(アーカイブtar.gz)に
#+使用法:
#+ sh backup.sh archive_nameソースフォルダ宛先フォルダ
#+

#コマンドラインパラメータの最大数
MAXPARAMS = 3

if [$#-lt "$ MAXPARAMS"];
それから
反響する
echo "使用法:sh` basename $ 0` archive_nameソースフォルダfolder-destination"
反響する
0番出口
fi

if [$#-gt "$ MAXPARAMS"];
それから
反響する
"echo"このスクリプトは$ MAXPARAMSコマンドライン引数のみを必要とします。 "
反響する
0番出口
fi

#スクリプトで使用する変数
BACKUPFILE = $ 1 - バックアップ - $(日付+%m-%d-%Y)
archive = $ BACKUPFILE
BACKUPDIR = $ 2
ARCHIVEDIR = 3ドル

#移動元フォルダと移動先フォルダがあるか確認してください
もし[! -e $ BACKUPDIR];
それから
反響する
エコー "\\" $ BACKUPDIR \\ "は存在しません!"
反響する
0番出口
fi

もし[! -e $ ARCHIVEDIR];
それから
反響する
echo "\\" $ ARCHIVEDIR \\ "は存在しません。作成してください..."
mkdir $ ARCHIVEDIR
エコー「完了」
fi

#コピー元とコピー先にアーカイブがあるか確認してください。
cd $ ARCHIVEDIR
if [-e $ archive.tar.gz];
それからrm $ archive.tar.gz
fi

cd $ BACKUPDIR
if [-e $ archive.tar.gz];
それからrm $ archive.tar.gz
fi

#スクリプトの主要部分...
"\\" $ BACKUPDIR \\ "をファイル\\" $ archive.tar.gz \\ "にバックアップしています..."
見つけます。 -type f -print0 | xargs -0 tar rvf "$ archive.tar"\u003e / dev / null
gzip $ archive.tar
"echo" \\ "$ BACKUPDIR \\"はファイル\\ "$ archive.tar.gz \\"に正常にアーカイブされました。

#アーカイブをARCHIVEDIRフォルダに移動します。
"echo"アーカイブ\\ "$ archive.tar.gz \\"を\\ "$ ARCHIVEDIR \\"フォルダに移動します。
mv $ archive.tar.gz $ ARCHIVEDIR / $ archive.tar.gz
エコー「完了」

うまくいけば、私はいくつかの詳細で主な点についてコメントしました。 質問があれば、私に連絡してください。 [メール保護]  私はスクリプトを紹介したばかりのときに非常に役に立ちました、注目に値するMendel Cooper Advanced Bashスクリプトガイドもお勧めします。 成功したプログラミング

P.S どうもありがとう 3月  彼女のコメントとアドバイスのために。

  ( "コマンドシェルスクリプト言語でのプログラミング技術")には、参考資料が多すぎます。 そしてこれら二つの両極端の間には何もありません。 あなたがそれらに耳を傾けるべきであるけれども、私はこのガイドも書いています。

これは実用的な手引きです。私は、いつもかなり真剣なスタイルではありませんが、理論的な例ではなく実際の例を示します。 部分的には、これは自分が話していることを知っていてBashの本当に素晴らしい機能をいくつか示している人たちによって提供されたトリミングされた過度に単純な例を与えたくないという事実によると書いた。 実用的な観点でそれらを。 この本を勉強した後にそれについて読むことができます。そして、それは実生活であなたを助けるであろう演習と例を含みます。

UNIX / Linuxユーザー、システム管理者、そして教師としての私の実務経験から、私は人々が何年もの間自分のシステムと通信できることを知っています、そしてタスクの実行を自動化する方法を知りません。 そのため、UNIXシステムはユーザーにとって不便であるとよく考え、さらに悪いことに、これは遅くて古風なシステムであるという印象を持っています。 これは、このガイドを使用して対処できるもう1つの問題です。

誰がこの本を読むべきですか?

UNIXまたはUNIX風のシステムを使用していて、自分自身、経験豊富なユーザー、そして自分の生活を楽にしたいと考えている人 システム管理者。 コマンドラインを使用してシステムを操作する方法をすでに理解している読者は、日常の作業を容易にすることができるシェルスクリプトの作成に関する詳細をすべて学習します。 システム管理はスクリプトに大きく依存しています。 日常の作業はしばしば自動化されています。 簡単なスクリプト。 この文書では、あなたがあなた自身のスクリプトを書くよう促し、既存のスクリプトを改良するよう奨励する多くの例があります。

このコースに進む前に:

  • 基本的なコマンドに精通しており、マニュアルの説明ページとドキュメントがある、経験豊富なUNIXまたはLinuxユーザーである必要があります。
  • テキストエディタを使うことができる。
  • システムの起動とプロセスの停止方法、initの機能、initスクリプトの使用方法を理解する。
  • ユーザーとグループを作成し、パスワードを設定します。
  • アクセス権と特別なモードが何かを知っている。
  • デバイスの命名規則、パーティションとは何か、ファイルシステムのマウント/アンマウントについて理解する。
  • 追加できる ソフトウェア  システムに入れてシステムから取り外します。

上記のトピックのうち1つ以上に精通していない場合は、TLDP WebサイトまたはローカルのTLDPミラーにあるLinuxの紹介の本を参照してください。 追加情報は、あなたのシステムのドキュメント(manページとinfoページ)またはLinux Documentation ProjectのWebサイトにあります。

印刷物では、このマニュアルはFultus.comで入手できます。

図1 本の表紙「初心者のためのバッシュガイド」

このガイドは翻訳されています:

フランス語への翻訳が行われており、翻訳が完了するとすぐにそれへのリンクが表示されます。

変更履歴

変更履歴

読者の希望が考慮されました:9章のshiftコマンドの訂正は訂正されました、7章、3章、10章のタイプミス。

読者の願いを考えた。

変更された住所

読者のコメントが挿入され、DocBookタグを使用してインデックスが追加されました。

例は第4章で説明され、第9章の埋め込み文書(ここではdoc)の記述が訂正され、誤字の一般的なチェックと訂正が加えられ、そして第6章のawkに関する中国の翻訳への言及が追加されました。

3、6、7章の誤字の修正、ユーザーのコメントの追加、7章のメモの追加。

デバッグについて少し、いくつかのキーワード、新しいBash 3.0に関する情報を追加し、画像を追加しました。

LDPの初期リリース。 より多くの例、より多くのメモ、より少ないエラーと省略、用語集の追加

リビジョン1.0-beta

ありがとう

助けてくれた(あるいは助けようとした)すべての友達と私の夫に感謝します。 あなたの心強い言葉がこの仕事を可能にしました。 エラーを報告し、例やコメントを送ってくれたみんなに感謝します。

  • ファンの一人にハンス・ボル(Hans Bol)。
  • スタイルについてのコメントはMike Sim(Mike Sim)。
  • 配列を含む例についてはDan Richter。
  • タイトルに関するアイデアについてはGeorges Ferguson(Gerg Ferguson)。
  • 職場を提供したメンデル・ル・クーパー(Mendel Leo Cooper)。
  • #linux.be、私を助けてくれてありがとう。
  • Frank Wang、私が間違ったことすべてについての詳細なコメントを寄せてください;-)

一般的なつづりと文法チェックをすることを約束したTabatha Marshallに感謝します。 我々は持っていた 素晴らしいチーム:私が寝たとき彼女は働いた。 そしてその逆;-)

(英語版のエラーについて話しています - パーマ。).

著作権情報

*著作権(c)2002-2007、Machtelt Garrels *すべての権利予約。 以下の条件が満たされます。* * * * * * * * * * * *) * * *バイナリ形式での再配布はドキュメントとともに提供されています。 原則として使用できます。 *このソフトウェアは「現状のまま」著者および寄託者によって提供されており、*特定の目的のために明示的または暗示的に示されているのは商品性および適合性の公開 IN * EVENT DIRECT、INDIRECT、INCIDENTAL、SPECIAL、ENDMPLARY、または必然的な損害(ただし、限定はされません、代理の獲得) 利益、契約に違反している、注文に違反している、その他に含まれているなどの注文 そのような損傷の可能性。

作者と出版社は、情報の正確性を確保するために、この本の作成にあらゆる努力をしました。 ただし、本書に含まれる情報は、明示的にも黙示的にも無保証で提供されています。 著者、出版社、販売店、配給業者のいずれも、本書によって直接的または間接的に引き起こされた、またはそのために引き起こされた損害について一切の責任を負いません。

本書で使用されているロゴ、商標、および記号は、それぞれの所有者に帰属します。

何が必要ですか?

この文書の構成

このガイドでは、日常生活の中で真面目なBashユーザーに役立つと思われる概念について説明します。 読者にはコマンドシェルの使用に関する基本的な知識が必要ですが、最初の3つの章ではコマンドシェルの主な構成要素と実際的な例の説明から始めます。

第4章から第6章では、シェルスクリプトで一般的に使用される基本的なツールについて説明します。

第8章から第12章では、シェルスクリプトで使用される最も一般的な構成について説明します。

各章には、次の章への準備をテストするための演習が含まれています。

  • 第1章「コマンドシェルとBashスクリプト」 - Bashの基礎:Bashが非常に優れている理由、コンポーネント、優れたスクリプトを開発するための最初のヒント。
  • 第2章「スクリプトの作成とデバッグ」 - スクリプトの基本:スクリプトの作成とデバッグ。
  • 第3章「Bash環境環境」 - Bash環境環境:初期設定ファイル、変数、特殊文字プロパティの変更、置換の順序 コマンドシェル、エイリアス、パラメータ。

この記事を読んだ後、あなたは何があるのか​​学ぶでしょう バッシュ  (標準のLinuxコマンドインタプリタ)、標準のコマンドを処理する方法を学びます。 ls, cp, mv... iノードの目的、ハードリンクおよびシンボリックリンクなどを理解します。

このガイドは、Linuxの初心者を対象としています。ファイルのコピーや移動、リンクの作成、リダイレクトやパイプとともに標準のLinuxコマンドを使用するなど、Linuxの基本原則についての理解を繰り返しまたは向上させたい方を対象としています。 この記事には、提示された資料を説明する多くの例があります。 初心者のために、情報のほとんどは新しくなるでしょう、そしてより高度なユーザーのためにこの資料は既存の知識とスキルを一般化するための優れたツールになることができます。

bashの紹介

シェル

あなたがLinuxを使っているなら、あなたはログイン後にあなたがコマンドインタプリタからの招待によって歓迎されていることを知っています。 例えば、

\$

ログイン後にグラフィカルシェルがロードされている場合は、コマンドインタプリタにアクセスするために、ターミナルエミュレータ(gnome-terminal、xfce4-terminal、konsole、xterm、rxvt ...)を起動するか、またはを押して仮想ターミナルに切り替えます。 CtrlAltF1  または CtrlAltF2  など

コンピューターのコマンドプロンプトは、例に示されているものとは異なる場合があります。 ユーザー名、コンピュータ名、および現在の作業ディレクトリの名前を含めることができます。 しかし、これらすべての違いにもかかわらず、この招待状を印刷するプログラムは「と呼ばれます シェル"(シェル)、そしてあなたのコマンドシェルの役割で最も可能性の高いプログラムは、 バッシュ.

あなたはbashを走っていますか?

次のコマンドでbashが動作しているかどうかを確認できます。

\$ echo \\ $ SHELL / bin / bash

このコマンドの実行の結果としてエラーを受け取ったか、その出力が例のものと異なる場合は、システムがbashをコマンドシェルとして使用していない可能性があります。 それにもかかわらず、ほとんどの資料は関連性がありますが、それでもbashに切り替えることをお勧めします。 これは(bashがシステムにインストールされている場合)以下のコマンドで実行できます。

\$ バッシュ

bashとは

Bash(の頭字語) B私達の ある得る SHell ")は、ほとんどのLinuxシステムで標準的なコマンドインタプリタです。彼の任務は、ユーザがコンピュータを制御するためのコマンドの処理と実行を含みます。作業が完了したら、コマンドインタプリタプロセスを完了できます。 CtrlDチーム 出口  または ログアウト  シェルプロセスが完了し、画面にユーザー名とパスワードの入力を再度要求されます。

"cd"を使う

ファイルシステムをナビゲートするためにbashを使い始めましょう。 はじめに、次のコマンドを入力します。

$ cd /

このコマンドで、ルートディレクトリに移動したいことをbashに示しました - / 。 システム内のすべてのディレクトリはツリー構造に編成されています。 /   これがその始まり(またはルート)です。 チーム cd  現在の作業ディレクトリを変更します。

パス

ファイルシステム内の現在の場所(現在の作業ディレクトリ)を調べるには、次のように入力します。

\$ pwd /

上記の例では /   - コマンド引数 cd  - と呼ばれる 。 これは、移動したいファイルシステムの場所です。 この場合 /   - 絶対パス。これは、パスがルートディレクトリを基準にして指定されていることを意味します。

絶対的な方法

絶対パスの例をいくつか示します。

   / dev / usr / usr / bin / usr / local / bin

お気づきかもしれませんが、これらすべてのパスは、で始まるという事実によって統合されています。 / 。 コマンドへの引数としてパス/ usr / local / binを指定する cd  ルートディレクトリに移動するように指示します。 / それから、usrディレクトリへ、そしてlocalとbinへ。 絶対パスは常にで始まります /

相対パス

2番目の種類のパスは相対パスと呼ばれます。 バッシュチーム cd  他のコマンドは現在のディレクトリを基準にしてこれらのパスをカウントします。 相対パスは決して始まらない / 。 たとえば、/ usrにいるとします。

\$ cd / usr

それから相対パスを使って/ usr / local / binに行くことができます。

\$ cd local / bin \$ pwd  / usr / local / bin

".."を使う

相対パスには1つ以上のディレクトリを含めることができます。 ".." 。 ".."は作業ディレクトリに対する親ディレクトリを示します。 例:

\$ pwd  / usr / local / bin \\ $ cD .. \$ pwd / usr / local

ご覧のとおり、チーム cD ..  「私たちをより高いレベルに引き上げます。」

追加できます ..   相対パスへ。 これにより、私たちがいるディレクトリと同じレベルのディレクトリに移動することができます。 例:

\$ pwd  / usr / local \\ $ cd ../share \$ pwd  / usr / share

相対パスを使用した例

相対パスはかなり複雑になる可能性があります。 ここにいくつかの例があります。 コマンドの結果は表示されません。bashを使用するディレクトリを決めてください。

\$ cd / bin \$ cd ../usr/share/zoneinfo \$ cd / usr / X11R6 / bin \$ cd ../lib/X11 \$ cd / usr / bin \$ cd ../bin/../bin

作業ディレクトリ "。"

チームについての会話を終了する前に cdもう少し言及する必要があります。 まず、別の特別なディレクトリがあります "." これは現在のディレクトリを示します。 このディレクトリは、現在のディレクトリにある実行可能ファイルを実行するために使用されます。

\$ ./myprog

最後の例では、myprogは現在のディレクトリにある実行可能ファイルで、実行のために起動されます。

cdとユーザーのホームディレクトリ

ホームディレクトリに移動するには、次のように入力する必要があります。

\$ cd

cd引数がなければ、あなたをあなたのホームディレクトリに移動します。 スーパーユーザーの場合、ホームディレクトリは通常/ rootであり、通常のユーザーの場合は/ home / username /です。 しかし、ホームディレクトリにある特定のファイルを指定したい場合はどうなりますか。 たとえば、プログラムへの引数として。 "myprog"? あなたが書くことができます:

\$ ./myprog /home/user/myfile.txt

ただし、絶対ファイルパスを使用することが常に便利というわけではありません。 同じ操作を次のようにして実行できます。 ~ - ティルダ:

\$ ./myprog〜/ myfile.txt

~   - bashでユーザーのホームディレクトリを示す特別な名前。

他のユーザーのホームディレクトリ

しかし、他のユーザーのホームディレクトリにあるファイルを指定する必要があるとしたらどうでしょうか。 これを行うには、ティルダの後にこのユーザーの名前を指定する必要があります。 たとえば、ユーザーfredのホームディレクトリにあるfredsfile.txtファイルを指すには、次のように入力します。

\$ ./myprog〜fred / fredsfile.txt

Linuxコマンド

lsの紹介

あなたはおそらくすでにそのチームに精通しているでしょう。 ls引数なしで呼び出されると、作業ディレクトリに格納されているファイルのリストが表示されます。

\$ cd / usr \$ ls  X11R6 doc i686-pc-linux-gnu lib man sbin ssl bin gentoo-x86インクルードlibexec portage共有tmp distfiles i686-linux情報local portage.old src

オプションを指定した場合 -a隠しファイル(名前はドットで始まる)も含めて、すべてのファイルを見ることができます。

\$ ls -a 。 bin gentoo-x86にはlibexec portage share tmpが含まれています。distfiles i686-linux情報local portage.old src x11R6 doc i686-pc-linux-gnu lib man sbin ssl

詳細なディレクトリ一覧

チーム自身の後に ls  引数は1つ以上のファイルまたはディレクトリです。 ファイル名を指定した場合は、コマンド ls  このファイルに関する情報だけを表示します。 そしてディレクトリの名前を指定すると、 ls  すべての内容を表示します。 オプション "-l"  チーム ls  ファイル名(ファイルのアクセス権、所有者の名前、時間)に加えて、それらについての詳細情報を見つけたい場合に非常に便利です。 最後の変更  ファイルとそのサイズ)。

次の例は、オプションの使用方法を示しています。 "-l"  / usrディレクトリに格納されているファイルに関する情報を表示する

\$ ls -l / usr  drwxr-xr-x 7ルートルート168 Nov 24 14:02 X11R6 drwxr-xr-x 2ルートルート14576 12月27 08:56 bin drwxr-xr-x 2ルート8856 12月26 12:47 distfiles lrwxrwxrwx 1ルート9 12月22 20:57 doc - \u003e share / doc drwxr-xr-x 62 root 1856 12月27日15:54 gentoo-x86 drwxr-xr-x 4 root 152 12月12日23:10 i686-linux drwxr-xr-x 4ルート96 11月24日13時17分i686 - PC - Linuxの - GNU drwxr - xr - x 54ルート5992 12月24日22時30分含まれているlrwxrwxrwx 1ルート10 12月22日20時57分情報 - \u003e共有/情報drwxr - xr -x 28 root root 13552 Dec 26 00:31 lib root drwxr-xr-x 8 root 240 root 12月22 20:57 local lrwxrwxrwx 1 root 9 12月22 20 :57 man - \u003e share / man lrwxrwxrwx 1ルートroot 11 Dec 8 07:59 portage - \u003e gentoo-x86 / drwxr-xr-x 60 root root 1864 12月8日07:55 portage.old drwxr-xr-x 3ルート 3096 12月22 20:57 sbin drwxr-xr-x 46ルート1144 12月24 15:32シェアdrwxr-xr-x 8ルート328 12月26 00:07 src drwxr-xr-x 6ルート176 11月24 24 14: 25 ssl lrwxrwxrwx 1ルート10 12月22 20:57 tmp - \u003e ../var/tmp

最初の列は、リスト内の各ファイルのアクセス情報を示しています。 (私は少し後で文字が何を意味するかを説明するつもりです。)次の列はリストの各項目へのリンクの数を示しています。 3列目と4列目は、それぞれファイルの所有者とグループです。 5列目はサイズです。 6番目は最後にファイルが変更された時刻です(「最終更新時刻」またはmtime)。 最後の列はファイルまたはディレクトリの名前です(これがリンクの場合は、 " –> msgstr "" "それはそれが参照するオブジェクトの名前です)。

ディレクトリのみを表示する方法

時にはディレクトリに関する情報だけを見て、それらのすべての内容に関する情報を見ないことが必要な場合があります。 この作業にはオプションが役立ちます。 "-d"ディレクトリに関する情報だけを表示するようにコマンドに指示します。 例:

\$ ls -dl / usr / usr / bin / usr / X11R6 / bin ../share  drwxr-xr-x 4ルート96 12月18日18:17 ../share drwxr-xr-x 17ルートルート576 12月24 09:03 / usr drwxr-xr-x 2ルート3192 12月26 12:52 / usr / X11R6 / bin drwxr-xr-x 2ルートルート14576 12月27日08:56 / usr / bin

再帰的リストとiノード情報

アクションオプション " - R"  行動の反対 "-d"。 ディレクトリにあるファイルに関する情報を再帰的に表示することができます。 最初に、最上位ディレクトリの内容が表示され、次にすべてのサブディレクトリの内容が順番に表示されます。 このコマンドの出力は非常に長くなる可能性があるので、例を挙げませんが、次のように入力して自分で試してみることができます。 コマンドライン "ls -R「または」 ls -ll".

そして最後に、オプション "-i"  各ファイルシステムオブジェクトのiノードを出力するために使用されます。

\$ ls -i / usr   1409 X11R6 314258 i686-linux 43090 libexec 13394 sbin 1417 bin 1513 i686-pc-linux-gnu 5120ローカル13408共有8316 distfiles 1517 sim 776男23779 src 43 doc 1386情報93892 sdc 35737 ssl 70744 784 tmp

iノードとは

各ファイルシステムオブジェクト(file、directory ...)はそれ自身のユニークな番号を持ちます。 inode  (iノード番号) この情報は重要ではないように思われるかもしれませんが、iノードの機能を理解しておくと、ファイルシステムに対する操作の多くを理解するのに役立ちます。 たとえば、 "."   そして ".."   各ディレクトリに存在するリンクとして。 ディレクトリが何であるかを理解する ".." inodeディレクトリ/ use / localを調べます。

\$ ls -id / usr / local   5120 / usr / local

ご覧のとおり、/ usr / localディレクトリのiノードは5120です。次に、/ usr / local / bin / ..ディレクトリのiノードを確認しましょう。

\$ ls -id / usr / local / bin / ..   5120 / usr / local / bin / ..

/ usr / localディレクトリと/ usr / local / bin / ..ディレクトリのiノードは同じであることがわかります。 これは、2つの名前がiノード5120を参照することを意味します。つまり、/ usr / localと/ usr / local / bin /です。 各iノードは特定のディスクスペースを指します。

各iノードには、複数のファイルシステムオブジェクト名を付けることができます。 ファイルの「同義語」(1つのiノードを参照するファイルシステムオブジェクト)の数は、コマンドの出力の2番目の列にある数を示します。 ls -l".

\$ ls -dl / usr / local  drwxr-xr-x 8ルートルート240 12月22日20時57分/ usr / local

この例は(2列目)、ディレクトリ/ usr / localが8つの異なるファイルシステムオブジェクトによって参照されていることを示しています。 これが彼らの名前です:

/ usr / local / usr / local / / usr / local / bin / .. / usr / local / games / .. / usr / local / lib / .. / usr / local / sbin / .. / usr / local / share / .. / usr / local / src / ..

mkdir

コマンドを見てみましょう mkdir。 それは新しいディレクトリを作成するのに役立ちます。 次の例は、/ tmpディレクトリに3つの新しいディレクトリ(tic、tac、toe)を作成する方法を示しています。

\$ cd / tmp $ mkdir tic tac toe

デフォルトのコマンド mkdir  ネストしたディレクトリ構造を作成することはできません。 したがって、互いに入れ子になったいくつかのディレクトリを作成する必要がある場合( 勝った/ der / ful次に、このコマンドを順番に3回呼び出す必要があります。

\$ mkdirが勝った/ der / ful  mkdir:ディレクトリを作成できません。won / der / ful:そのようなファイルまたはディレクトリはありません\\ $ mkdirが勝ちました \$ mkdirが勝った/ der \$ mkdirが勝った/ der / ful

オプションを追加することでこの操作を簡単にすることができます "-p"  mkdirコマンドに。 このオプションはネストされたディレクトリ構造を作成することを可能にします。

\$ mkdir -p easy / as / pie

このユーティリティの機能の詳細については、コマンドによって呼び出されるヘルプを参照してください。 男mkdir。 このガイドのほとんどすべてのコマンドにヘルプがあります(たとえば 男lsを除く cdなぜなら それはbashに組み込まれています(そのようなコマンドのために、ヘルプはこのように呼ばれます: ヘルプCD)

触れる

勉強チームに行こう cp  そして mvファイルやディレクトリのコピー、名前の変更、移動に使用されます。 しかしその前に、コマンドを使用して/ tmpディレクトリに空のファイルを作成します。 触れる:

\$ cd / tmp \$ タッチコピー

チーム 触れる  最後のファイルアクセス時間(コマンド出力の6列目)を更新します。 ls -l)すでに存在する場合、または存在しない場合は新しい空のファイルを作成します。 この操作の後、空のファイルができるはずです。 / tmp / copyme.

反響する

空のファイルができたので、次のコマンドでテキスト文字列を書き込みます。 反響するこれは、渡された引数を標準出力デバイス(この場合はテキスト端末)に出力します。

\$ "firstfile"をエコーする  firstfile

ファイルに文字列を書き込むには、コマンドの出力をそれにリダイレクトします。 反響する:

\$ echo "firstfile"\u003e copyme

サイン >   (more)左側にあるコマンドの出力を右側にある名前のファイルにリダイレクトするようにコマンドシェルに指示します。 この名前のファイルが存在しない場合は、自動的に作成されます。 そして、そのようなファイルがすでに存在する場合、それは上書きされます(その内容はすべて、行を書き込む前に消去されます)。 チーム "ls -l"  これで、ファイルのサイズが10バイトになりました。9バイトは「firstfile」という単語で占められ、1バイトは改行文字です。

\$ ls -l copyme  -rw-rrr-- 1 root root 10 Dec 28 14:13 copyme

猫とcp

ファイルの内容を端末に出力するには、次のコマンドを使用します。 ねこ:

\$ 猫のコピー  firstfile

これで、コマンドの基本機能の分析を始めることができます。 cp。 このコマンドは2つの引数を取ります。 最初のファイルは既存のファイルの名前( "copyme")、2番目のファイルは新しいコピーの名前( "copyme")です。

\$ cp copyme Copyme

ファイルの新しいコピーに異なるiノード番号があることを確認できます(これは、古いファイルへのリンクではなく、本当に新しい別のファイルを受け取ったことを意味します)。

\$ ls -i copyme Copyme   648284 Copyme 650704 Copyme

mv

今コマンドを適用しなさい mv  ファイルの名前を変更します( "Copyme" - \u003e "movedme")。 この操作後のiノード番号は変更されず、ファイル名のみが変更されます。

\$ mv copyme movedme \$ ls -i movedme   648284ムーブメント

iノード番号は、名前変更されたファイルがソースファイルが配置されていたファイルシステム内に残っている場合にのみ変更されません。 このチュートリアルの以下の部分で、ファイルシステムのレイアウトを詳しく見ていきます。

チーム mv  ファイルの名前を変更するだけでなく、それらを移動することもできます。 たとえば、ファイルを移動する /var/tmp/myfile.txt  ディレクトリへ / home / user  コマンドを与える必要があります:

\$ mv /var/tmp/myfile.txt / home / user

ファイルはユーザーのホームディレクトリに移動されます。 ユーザー  別のファイルシステムにある場合でも(この場合、ファイルは新しい場所にコピーされ、元のファイルは削除されます)。 ご想像のとおり、ファイルを別のファイルシステムに移動すると、そのiノードが変更されます。 これはそれぞれ ファイルシステム  独自のiノードのセットがあります。

なお、割り当てられた新しいiノード番号が古いものと一致する可能性がありますが、非常に小さいです。

一度に複数のファイルを同じディレクトリに移動するには、次のように書きます。

\$ mv /var/tmp/myfile1.txt /var/tmp/myfile2.txt / home / user \$ mv -t / home / user /var/tmp/myfile1.txt /var/tmp/myfile2.txt

オプションを追加した場合 "-v"画面に操作に関するレポートが表示されます。

\$ mv -vt / home / user /var/tmp/myfile1.txt /var/tmp/myfile2.txt   "/var/tmp/myfile1.txt" - \u003e "/home/user/myfile1.txt" "/var/tmp/myfile2.txt" - \u003e "/home/user/myfile2.txt"

リンクの作成とファイルの削除

ハードリンク

ディレクトリとiノードについて話したとき、私はすでに「リンク」という言葉を述べました。 実際、Linuxには2種類のリンクがあります。 最初の種類はハードリンクと呼ばれます。 各iノードには、それに関連付けられた複数のハードリンクを設定できます。 したがって、ファイルはシステム内にいくつかの異なる名前で存在していることがわかります。 少なくとも1つの名前がそのiノードに関連付けられている限り、ファイルは存在します。 「ファイルへのハードリンク」と「ファイル名」という用語は同義語です。 ファイルへの新しいハードリンクは、コマンドを使用して実行できます。 ln

\$ cd / tmp \$ firstlinkをタッチ \$ ln firstlink secondnlink \$ ls -i firstlink secondlink   15782第1リンク15782第2リンク

例からわかるように、ハードリンクはiノードレベルで機能し、特定のファイルを指します。 Linuxでは、ハードリンクにはいくつかの制限があります。 まず、ファイルへのハードリンクだけを作成でき、ディレクトリへのリンクは作成できません。 システムがディレクトリへのハードリンクを持っているという事実にもかかわらず、それはそれです( " . 「と」 .. スーパーユーザーでもディレクトリへの追加のハードリンクを作成することはできません。次に、各ファイルシステムに独自のiノードセットがあるため、別のファイルシステムにあるファイルへのハードリンクを作成することはできません。

シンボリックリンク

実際には、シンボリックリンクがよく使われます(または シンボリックリンク) シンボリックリンクは、inodeを直接参照するのではなく、別のファイルを名前で参照する特殊な種類のファイルです。 シンリンクは、ファイルが削除されないように保護しません。 ファイルが削除されると、それへのシンボリックリンクは非アクティブになります(または 壊れた).

シムリンクはチームによって作成されます ln  オプション付き "-s":

\$ ln -s secondlink thirdlink \$ ls -l最初のリンク2番目のリンク3番目のリンク  -rw-rw-r-- 2アグリフィスアグリフィス0 Dec 31 19:08 firstlink -rw-rw-r-- 2アグリフィスagriffis 0 Dec 31 19:08 secondlink lrwxrwxrwx 1アグリフィスagriffis 10 Dec 31 19:39 thirdlink - \u003e secondlink

シンボリックリンクは、コマンド出力によって認識できます。 ls -lまず、シンボリックリンクの最初の列に文字があります "l"  (英語の単語の最初の文字link - link)、第二に、シンボリックリンクのサイズは、それが参照するファイル名の文字数に等しい( 「セカンドリンク」  私たちの場合)、3番目に、リンクの名前に加えて、最後の列はそれが参照しているファイルの名前を含みます。 –>

シンボリックリンクについて

/ usr / local / binを指し、/ tmp /ディレクトリにあるシンボリックリンクを作成したい場合を考えてみましょう。 我々は書くことができます:

\$ ln -s / usr / local / bin bin1 \$ ls -l bin1  lrwxrwxrwx 1 root root 14 Jan 1 15:42 bin1 - \u003e / usr / local / bin \\ $ ln -s ../usr/local/bin bin2 \$ ls -l bin2 lrwxrwxrwx 1 root root 16 Jan 1 15:43 bin2 - \u003e ../usr/local/bin \\ $ ls -l bin2  lrwxrwxrwx 1 root root 16 Jan 1 15:43 bin2 - \u003e ../usr/local/bin \\ $ mkdir mynewdir \$ mv bin2 mynewdir \$ cd mynewdir \$ cd bin2  bash:cd:bin2:そのようなファイルやディレクトリはありません

ディレクトリ/ tmp / usr / local / bin /が存在しないため、作業ディレクトリをbin2に変更することはできません。 つまり、移動後、リンクは機能しなくなりました( "bat"になりました)。

このため、相対パスを使用してシンボリックリンクを作成しないようにする必要があります。 しかし時にはそれは便利です。 次のような場合を考えてみましょう:/ usr / binにあるプログラムにリンクしたい(つまり、このプログラムに別名を付けたい)とします。

# ls -l / usr / bin / keychain  -rwxr-xr-x 1ルートルート10150 12月12日20時09分/ usr / bin / keychain

スーパーユーザー(root)は、より短い名前 "kc"を持つプログラム "keychain"へのリンクを作成することをお勧めします。 この例では、bashプロンプトによって証明されるように、システムへのrootアクセス権があります。 "#" 。 通常のユーザーは/ usr / bin /ディレクトリにファイルを作成できないため、スーパーユーザー権限が必要です。 これで、プログラムにrootとして別の名前を付けることができます。

# cd / usr / bin # ln -s / usr / bin / keychain kc # ls -lキーチェーン  -rwxr-xr-x 1ルートルート10150 Dec 12 20:09 / usr / bin / keychain# ls -l kc  lrwxrwxrwx 1 root root 17 Mar 27 17:44 kc - \u003e / usr / bin / keychain

この例では、/ usr / bin / keychainファイルを参照するkcシンボリックリンクを作成しました。

# mv / usr / bin /キーチェーン/ usr / bin / kc / usr / local / bin # ls -l / usr / local / bin / kc  lrwxrwxrwx 1 root root 17 Mar 27 17:44 kc - \u003e / usr / bin / keychain

リンクを作成するときに絶対パスを使用したので、リンクは/ usr / bin / keychainファイルを指し続けます。 しかし、リンクを作成するときに相対パスを使用しても、それは機能し続けます。

多くの場合、両方のシンボリックリンク(絶対パス、相対パス、およびパスを含む)はうまく機能します。 次の例は、シンボリックリンクの作成方法を示しています。シンボリックリンクは、移動した後も機能し続けます。

# cd / usr / bin # ln -sキーチェーンkc # ls -l kc  lrwxrwxrwx 1 root root 8 Jan 5 12:40 kc - \u003e keychain# mvキーチェーンkc / usr / local / bin # ls -l / usr / local / bin / keychain  -rwxr-xr-x 1ルートルート10150 Dec 12 20:09 / usr / local / bin / keychain# ls -l / usr / local / bin / kc  lrwxrwxrwx 1ルートルート17 Mar 27 17:44 kc - \u003eキーチェーン

これで、 "keychain"プログラムを/ usr / local / bin / kcとしてアクセスして実行することができます。

rM

チームがどのように機能するかがわかった cp, mv  そして ln  ファイルを削除する方法を学ぶ時が来ました。 通常、削除は以下のコマンドを使って行われます。 rM。 いくつかのファイルを削除するには、引数としてそれらの名前をスペースで区切ってコマンドラインに入力するだけです。 rM:

\$ cd / tmp \$ タッチファイル1ファイル2 \$ ls -lファイル1ファイル2  -rw-r - r-- 1ルートルート0 1月1日16時41分file1 - rw-r - r-- 1ルートルート0 1月1 16時41分file2 \\ $ rMファイル1ファイル2 \$ ls -lファイル1ファイル2  ls:file1:そのようなファイルまたはディレクトリはありませんls:file2:そのようなファイルまたはディレクトリはありません

覚えている 削除されたファイル  (あなたが試すことができるが)回復することは不可能です。 したがって、多くの初心者のLinuxユーザーはこのオプションを使用します。 "-i"  チーム rMそのため、各ファイルの削除を確認するようにユーザーに依頼する必要があります。

\$ rm -iファイル1ファイル2  rm:通常の空のファイル `file1"を削除しますか?   rm:通常の空のファイル `file2"を削除しますか?

最後の例では、各ファイルを削除する前に、 rM  質問:ユーザーは本当にファイルを削除しますか? 削除を確定するには、キーを押します "y"  キーボードで、そして削除を拒否する - キー "n".

組み合わせを押すことで(意図したとおりに問題が発生した場合)コマンドの実行を中断することができます。 CtrlC.

オプションがなくても、rmコマンドに各ファイルを削除するための確認を求めるようにする "-i"  ファイルに追加することができます 〜/ .bashrc  好きなテキストエディタを使ってください。

別名rm = "rm -i"

rmdir

ディレクトリを削除する方法は2つあります。ディレクトリの内容全体を1つずつ削除してから、次のコマンドを使用する方法です。 rmdir  ディレクトリ自体を削除するには

\$ mkdir mydir \$ タッチmydir / file1 \$ rm mydir / file1 \$ rmdir mydir

この方法は一般に「敗者のためにディレクトリを削除する方法」と呼ばれています。 このコマンドを使うほうがずっと便利です "rm -rf"  すべての内容とともにディレクトリを削除します。

\$ rm-rf mydir

このコマンドは慎重に使用してください。助けを借りれば(特にroot権限を持つ)経験の浅い管理者にとっては、木材(そしてLinuxシステム)を簡単に壊すことができるからです。

ワイルドカードを使う

ワイルドカードとは

Linuxを日常的に使用すると、多くのファイルに対して1つの簡単な操作(たとえば、rm)を実行する必要がある場合がよくあります。 この場合、コマンドラインにすべてのファイル名をリストするのはあまり便利ではありません。

\$ rmファイル1ファイル2ファイル3ファイル4ファイル5ファイル6ファイル7ファイル8

この問題はワイルドカードで解決できます。 Linuxのコマンドインタプリタはテンプレートを使って複数のファイルを指定する機能をサポートしています(歴史的な理由から、これは "globbing"とも呼ばれます)。 Bashやその他のLinuxコマンドは、パターンに一致するファイルだけを選択します。 したがって、ファイル1からファイル8までファイルを削除する必要がある場合は、次のように書く必要があります。

\$ rmファイル

そして、名前がfileで始まるすべてのファイルとfileという名前のファイルを削除するとします。

\$ rmファイル*

パターン *   任意の文字、一連の文字、または「文字なし」に一致します。 もちろん、以下に示すように、テンプレートはファイルを削除するためだけではありません。

一致が見つからない場合

名前が文字で始まるディレクトリ/ etc /にあるファイルのリストを表示したい場合 "g"  "g"という名前のファイル(存在する場合)では、次のように書く必要があります。

\$ ls -d / etc / g *  / etc / gconf / etc / ggi / etc / gimp / etc / gnome / etc / gnome-vfs-mime-magic / etc / gpm / etc / group / etc / group-

どのファイル名とも一致しないテンプレートを指定した場合に何が起こるのか見てみましょう。

\$ ls -d / usr / bin / asdf * jkl  ls:/ usr / bin / asdf * jkl:ファイルやディレクトリがありません

この例では、名前が "asdf"で始まり "jkl"で終わるファイルのリストを表示しようとしました。 コマンドインタプリタは、そのような名前のファイルが見つからないというメッセージを出しました。

テンプレートの構文:*と?

グロビングがどのように機能するかを調べました(ファイル名の展開)。 それでは、テンプレートの構文を詳しく見てみましょう。

*   0個以上の文字に一致します。

  • / etc / g *  - 名前が "g"で始まるディレクトリ/ etc /内のすべてのファイルと "g"という名前のファイル。
  • / tmp / my * 1  - 名前が "my"で始まり "1"で終わる/ tmpディレクトリ内のすべてのファイル( "my1"という名前のファイルを含む)

?   任意の1文字を置き換えます。

  • マイファイル?  - 名前が "myfile"で始まり、その後に任意の1文字が続くファイル。
  • / tmp / notes?txt  - "notes.txt"および "notes_txt"という名前のファイルに一致します(/ tmp /に存在する場合)。

角かっこ:

パターンは ""と非常によく似ています ? ""は括弧で指定されたものから1文字と一致します。この場合、括弧内の文字範囲( - /ハイフン文字を使用)または行内の複数の範囲を指定することもできます。 この範囲のシンボル:

  • myfile  - myfile1とmyfile2に対応します。 この2つのファイルのうち少なくとも1つが存在する限り、テンプレートは機能します。
  • ハンゲオグ  - Changelog、ChangeLog、changeLog、およびchangelogという名前のファイルを照合します。 ご覧のとおり、パターンを使用すると、大文字と小文字が異なる名前を検索するときに便利です。
  • ls / etc / *  - / etc /ディレクトリ内の名前が数字で始まるファイルを一覧表示します。
  • ls / tmp / *  - 名前が英字(大文字または大文字)で始まる/ tmpディレクトリ/内のファイルを一覧表示します。

構造体[は似ていますが、単一の文字に対応しますが、間には触れません。 [[   そして ] 。 例えば、

  • rm myfile [  - ファイル「myfile9」を除いて、名前が単語「myfile」とそれに続く1桁の数字で構成されているすべてのファイルを削除します。

使用例

これがテンプレートの使用例です。 bashは文字を解釈するので ? , [ , ] , *   置換パターンとして、これらの文字を含む引数を使用するときは注意が必要です。 たとえば、文字列 ""を含むファイルを作成したい場合 * "それから、次のコマンドはあなたが望むことをしないでしょう:

\$ echo *\u003e /tmp/mynewfile.txt

作業ディレクトリに、名前がパターンに該当するファイルが1つ以上ある場合 * 「そうすると/tmp/mynewfile.txtの中に文字列ではなく名前のリストが見つかるでしょう」 * 「しかし、どうすれば私たちは望むものを達成することができますか?最初の方法は一重引用符で文字列を取ることです。Bashは一重引用符で囲まれた文字列を通常のテキスト文字列として参照し、置換文字を明らかにしません。

\$ echo "*"\u003e /tmp/mynewfile.txt

このコマンドを実行した後、あなたのファイルは ""という文字列を含みます。 * 「予想通り。特殊文字をバックスラッシュでシールドする方法もあります( \ ) 特殊記号の前にバックスラッシュを置くと、この記号はテンプレートとしてではなくプレーンテキストとして扱う必要があることがインタプリタに通知されます。

\$ echo \\\\ *\u003e /tmp/mynewfile.txt

両方の提案された方法(一重引用符と遮蔽)は望ましい結果を与える。 バックスラッシュでエスケープすることについて話しているので、それはテキスト文字を示すためにそれを言うことは価値があります "\"   あなたは一重引用符で囲むか、書くことができます "\\\"   (この組み合わせは、通常の単一のバックスラッシュとしてインタプリタによって解釈されます。 "\" )

備考二重引用符は、一重引用符とほぼ同じように機能しますが、bashが特殊文字を解釈できるようにします。 したがって、一重引用符は、テキストだけをコマンドに渡すための最良の方法です。 テンプレートの詳細については、ヘルプを読んでください。 「男7グロブ」。 引用符の使用に関する詳細は、このセクションを読んでください。 引用  ヘルプ 「男8グロブ」.

結論

おめでとうございます。Linuxの基本についての私達のレビューが終わりました。 私はその資料があなたにとって有益であったことを願っています。 このチュートリアルで扱うトピック、bashの基本、基本など linuxコマンド、リンク、ワイルドカードは、管理の基本に関する次の記事の基礎となるものです。この記事では、正規表現、アクセス権、ユーザーアカウント管理などについて説明します。

テーマを続ける:
アンドロイド

こんにちは、親愛なるprocraftmomey読者の皆さん。 私はあなたがどのようにできるかについてすでに書きました、我々は可能な収益について議論しました。 しかし、何かを売ることがよくあります(そして私たち...