2013年8月31日土曜日

【シェルスクリプト(bash)】Syntax error: EOF in backquote substitution

echoで変数の値をログに出力するために
echo "【○○○チェック】:${hoge}" >> hoge.log

としたところ、シンタックスエラーが発生・・・なぜ?
Syntax error: EOF in backquote substitution

とりあえず、追加したechoの行をコメントアウトすると正常に動く。

1時間ほど悩まされた結果
【○○○チェック】を【○○○CHECK】としたところ、正常に動くようになりました。
さらに謎が深まりましたがwww

特定の文字で(例えば「ッ」など)で発生しているのか?と思い
「チェック」を後ろから一文字ずつけして、実行したのですが「チェック」を
全て削除してようやく、正常に動作しました。
と、いうことは悪さをしていたのは「チ」か!!!と思い
ためしに、「○○○ェック」としたところ、処理が正常に動きました。
やったね♪
と思いたいところですが、「○○○ェック」では処理が動いても
意味が分からない。。。
なので、今回は【○○○CHECK】として、実装しました。
ただ、何故「チ」でエラーが起きるか分かりません。

ムズムズしますが、今日はこの辺で!

【シェルスクリプト(bash)】 2>&1とは?

シェルスクリプトのサンプルコードをながめていると
「2>&1」という記載があり、初心者には???

とりあえず、ググッてみたところ処理の内容が判明。

file.log 2>&1 と記載すると
標準エラー出力は標準出力と同じfile.logに出力するという意味になるようです。

もう少し、細かく見ていくと

2> は標準エラー出力のリダイレクトの指示という意味になります。
リダイレクト??と思ったので、さらに調べてみると下記の意味のようです。

<リダイレクト(ITproより引用)>
---------------------------------------------------------------
シェルは「キーボードから入力し、画面に出力する」ようになっている。
こうした入力と出力の方法を変更する場合には、リダイレクトを使う。

リダイレクトには出力先を切り替える「>」、出力先のファイルに追加する「>>」
入力元を切り替える「<」、複数行の入力を行える「<<」がある。
---------------------------------------------------------------

なるほど!!という感じでしょうか。

さらに細かくみると
ファイル・ディスクリプタの0~2はシェルと予約されているとのこと。
意味は
0:標準入力(シェルにどのように入力するかを指定。デフォルトはキーボード)
1:標準出力(シェルの結果をどこに出力するかを指定。デフォルトは画面)
2:標準エラー出力(シェルの実行時に発生したエラーメッセージの出力先を指定。デフォルトは画面)
※1の場合は省略可能
 echo "メッセージ" 1 > file ではなく echo "メッセージ" > file  としても同じ意味となります。

なので、2>&1 と指定すると
標準エラー出力(2)の出力先を、標準出力(1)と同じところに変更するという意味になるようです。

今回は、ITproさんの【 リダイレクトとは 】という記事を参考にさせていただきました。
こちらには、リダイレクトについてもっと詳細が書かれているので、興味のある方は
参照してみてください♪


同一ネットワーク上にある機器のMACアドレスの調べ方

ネットワークプリンタのIPアドレスを固定する際に、ルータにネットワークプリンタのMACアドレスを
設定する必要がある場合などに使用しています。

<手順>
 ①ネットワークアダプタを調べたい機器のIPアドレスを取得します。
 ②コマンドプロンプトを起動し、対象の機器と通信が行えるか確認します。
   ping XXX.XXX.XXX.XXX(①で調べたIPアドレス)
   ※Received出来ていれば通信が行えています。
 ③対象機器のMACアドレスを、コマンドプロンプトのarpコマンドを使用して調べます。
   arp -a XXX.XXX.XXX.XXX(①で調べたIPアドレス)
 
   表示された内容の、Physical Addressと書かれているXX-XX-XX-XX-XX-XXが
   ネットワークアダプタのMACアドレスになります。
 
 ※②を行わず、③を実行すると「No ARP Entries Found」というメッセージが表示されます。
  (XPで 確認)
    なので、②を実行後に③を行う必要があります。