ホームページ » の仕方 » シェルスクリプティング入門ガイド2

    シェルスクリプティング入門ガイド2

    もしあなたがあなたのオタクの信条を築きたいのなら、私たちのシェルスクリプティングシリーズの2回目の記事に参加してください。私たちは先週のスクリプトに対するいくつかの修正、いくつかの改善、そして初心者のためのループに関するガイドを持っています。.

    datecpスクリプトの再検討

    シェルスクリプトガイドの最初の記事では、ファイル名の末尾に日付を追加した後にファイルをバックアップディレクトリにコピーするスクリプトを作成しました。.

    Samuel Dionne-Rielさんは、コメントで私たちの変数参照を扱うためのもっと良い方法があると指摘しました.

    引数はbashシェルではスペースで区切られており、結果の展開されたコマンドにスペースがあるとトークン化されます。あなたのスクリプトで, cp $ 1 $ 2. $ date_formatted 展開された変数にスペースが含まれていない限り、意図したとおりに機能します。このようにあなたのスクリプトを呼び出すと: datecp "私の古い名前" "私の新しい名前" 展開すると次のコマンドが表示されます。 cp私の新しい名前私の古い名前。the_date 実際には6つの引数があります.

    この問題に適切に対処するために、スクリプトの最後の行は次のようになります。 cp "$ 1" "$ 2. $ date_formatted"

    ご覧のとおり、スクリプトの行を次のように変更してください。

    cp -iv $ 1 $ 2 $ date_formatted

    に:

    cp -iv“ $ 1”“ $ 2”。$ date_formatted

    名前にスペースが含まれているファイルに対してスクリプトを使用する場合は、この問題に注意してください。 Samuelはまた、このサイト(またはインターネット一般)からコードをコピーして貼り付ける際には、それらを置き換える「活版印刷的に優れた」文字を適切なダッシュと引用符で置き換えるようにしてください。私たちのコードがよりコピー/貼り付けに適しているかどうかを確かめるためにもっと努力します。 ;-)

    別のコメンター、Myles Braithwaiteは、日付がファイル拡張子の前に表示されるようにスクリプトを拡張することを決めました。だから代わりに

    tastyfile.mp3.07_14_11-12.34.56

    これを取得します。

    tastyfile.07_14_11-12.34.56.mp3

    これは、ほとんどのユーザーにとってもう少し便利になります。彼のコードは彼のGitHubページにあります。彼がファイル名を引き離すために使用しているものを見てみましょう。.

    date_formatted = $(日付+%Y-%m-%d_%H.%M%S)
    file_extension = $(echo“ $ 1 "| awk -F。 'print $ NF')
    file_name = $(ベース名$ 1。$ file_extension)

    cp -iv $ 1 $ファイル名 - $日付形式。$ファイル拡張子

    フォーマットを少し変更しましたが、1行目でMylesが自分の日付関数を宣言していることがわかりますが、2行目では、ファイルの名前を出力するためにスクリプトの最初の引数と共にechoコマンドを使用します。彼はpipeコマンドを使ってその出力を受け取り、それを次の部分の入力として使います。パイプの後、Mylesは「awk」コマンドを呼び出します。これは強力なパターンスキャンプログラムです。 -Fフラグを使用して、彼はコマンドに次の文字(スペースの後)が「フィールド区切り文字」を定義するものであることを伝えています。この場合、それは期間です.

    さて、awkは“ tastyfile.mp3”という名前のファイルが“ tastyfile”と“ mp3”という2つのフィールドで構成されていると見ています。最後に、彼は使っています

    'print $ NF'

    最後のフィールドを表示します。ファイルに複数のピリオドがある場合(つまり、awkに複数のフィールドを表示させる場合)、最後のもの(ファイル拡張子)だけが表示されます。.

    3行目で、彼はファイルの名前のための新しい変数を作成し、$ 1のすべてを参照するために“ basename”コマンドを使用します。 を除く ファイル拡張子これは、basenameを使用し、引数として$ 1を指定してから、スペースとファイル拡張子を追加することによって行われます。 2行目を参照する変数のために、ファイル拡張子が自動的に追加されます。

    tastyfile.mp3

    そしてそれをに変える

    おいしいファイル

    最後の行で、Mylesはすべてを順番に出力するコマンドをまとめました。スクリプトの2番目の引数である$ 2への参照はありません。この特定のスクリプトは代わりにあなたの現在のディレクトリにそのファイルをコピーします。素晴らしい仕事サミュエルとマイル!

    スクリプトと$ PATHを実行する

    また、基本記事では、スクリプトをデフォルトでコマンドとして参照することはできません。つまり、スクリプトを実行するには、スクリプトのパスを指定する必要があります。

    ./スクリプト

    〜/ bin / script

    しかし、あなたのスクリプトを〜/ bin /に置くことで、どこからでもそれらの名前をタイプして実行することができます。.

    最近のLinuxディストリビューションではデフォルトでそのディレクトリを作成していないため、コメンターはこれがどれほど適切であるかを議論するのにしばらく時間を費やしました。さらに、デフォルトで$ PATH変数に追加する人もいません。これは、スクリプトをコマンドのように実行するために必要なことです。私の$ PATH変数をチェックした後、コメンターは正しかったのですが、スクリプトを呼び出すことでまだうまくいくので、私は少し戸惑いました。私はその理由を見つけました。最近のLinuxディストリビューションの多くはユーザーのホームディレクトリに特別なファイルを作成します - .profile.

    このファイルはbashによって読み込まれ(ユーザーのホームディレクトリに.bash_profileが存在しない限り)、一番下に、〜/ bin /フォルダが存在する場合は$ PATH変数に追加されるセクションがあります。それで、その謎は解決されます。シリーズの残りの部分では、スクリプトは〜/ bin /ディレクトリに配置し続けます。これは、それらがユーザースクリプトであり、ユーザーが実行できるようにするためです。そして、うまく動作させるために$ PATH変数を手作業で台無しにする必要はないようです。.

    ループを使用したコマンドの繰り返し

    繰り返し作業に対処するためのオタク兵器庫で最も有用なツールの1つ、ループに行きましょう。今日は、「for」ループについて説明します。.

    forループの基本的な概要は次のとおりです。

    LIST内のVARIABLEのため。行う
    command1
    command2

    指揮
    終わった

    VARIABLEは任意の変数にすることができますが、ほとんどの場合、小文字の「i」が慣例的に使用されます。 LISTは項目のリストです。複数の項目を指定する(スペースで区切る)か、外部テキストファイルを指すか、またはアスタリスク(*)を使用して現在のディレクトリ内のファイルを指定できます。リストされたコマンドは慣例によりインデントされているので、入れ子にするのがより簡単です - ループをループに入れること(あなたがループしながらループすることができます).

    リストでは区切り文字としてスペースが使用されるため(つまり、スペースはリスト内の次の項目への移動を意味します)、名前にスペースが含まれているファイルは、あまり使い勝手がよくありません。今のところ、スペースなしでファイルを扱うことに固執しましょう。それでは、現在のディレクトリ内のファイルの名前を表示するための簡単なスクリプトから始めましょう。 〜/ bin /フォルダーに「loopscript」という名前の新しいスクリプトを作成します。これを実行する方法(実行可能としてマークすることやハッシュバングハックを追加することを含む)を覚えていない場合は、bashスクリプトの基本記事を参照してください。.

    その中に、次のコードを入力します。

    for item1 item2 item3 item4 item5 item6。行う
    エコー「$ i」
    終わった

    スクリプトを実行すると、それらのリスト項目を出力として取得します。.

    かなり単純ですね。少し物事を変えるとどうなるか見てみましょう。それがこう言うようにあなたのスクリプトを変更してください:

    私は*に。行う
    エコー「$ i」
    終わった

    このスクリプトをフォルダ内で実行すると、出力として含まれているファイルのリストが表示されます。.

    それでは、echoコマンドをもっと便利なものに変更しましょう。たとえば、zipコマンドです。つまり、ファイルをアーカイブに追加します。そして、ミックスにいくつかの引数を取りましょう。!

    私は$ @で。行う
    zipアーカイブ“ $ i”
    終わった

    何か新しいことがあります。 “ $ @”は“ $ 1 $ 2 $ 3…$ n”へのショートカットです。つまり、指定したすべての引数の完全なリストです。それでは、いくつかの入力ファイルを使用してスクリプトを実行したときに何が起こるかを見てください。.

    あなたは私のフォルダにあるファイルを見ることができます。 6つの引数を指定してコマンドを実行し、各ファイルを“ archive.zip”という名前のzip形式のアーカイブに追加しました。簡単、正しい?

    forループはとても素晴らしいです。これで、ファイルのリストに対してバッチ機能を実行できます。たとえば、スクリプトのすべての引数をzipアーカイブにコピーし、オリジナルを別のフォルダに移動し、そのzipファイルをリモートコンピュータに自動的に安全にコピーすることができます。 SSHで鍵ファイルを設定している場合は、パスワードを入力する必要もなく、アップロード後にzipファイルを削除するようにスクリプトに指示することもできます。!


    forループを使用すると、ディレクトリ内のすべてのファイルに対して一連のアクションを簡単に実行できます。多種多様なコマンドを積み重ねることができ、引数を使用して簡単にリストを作成して実行することができますが、これは氷山の一角にすぎません.

    脚本家のバッシュ、何か提案はありますか。あなたはループを使う便利なスクリプトを作りましたか?シリーズについてのあなたの考えを共有したいですか?いくつかのコメントを残して、他のスクリプティング初心者を助ける!