読者です 読者をやめる 読者になる 読者になる

ITの隊長のブログ

ITの隊長のブログです。いや、まだ隊長と呼べるほどには至っていないけど、日々がんばります。CakePHPとPlayFrameworkを使って仕事しています。最近はAngular2をさわりはじめたお(^ω^ = ^ω^)

忘れていたシェルスクリプトで、”/(スラッシュ)”の使い方を思い出す記事

ShellScript

スポンサードリンク

http://www.flickr.com/photos/37996588780@N01/4814208649
photo by jm3


俺の人生初のITは、Linuxからスタートしました。今思いかせば、かなり無謀でしたorz


で、初めて動くものを作ったのは、指定した複数のログを削除してくれる簡単なシェルスクリプトでした。


ちなみに、初めて購入したIT書籍はJavaを勉強しようとして、JavaScriptの本を購入しました(アホ)


話がそれてしまいましたが、約2年ぶりでしょうか。久々に業務でシェルスクリプトを触ったのでメモ




やりたいことは、sedである項目を置換するだけの話。


簡単とおもいきや、ディレクトリパスを変数に格納し、それを置換で置き換わる値として渡したらエラーが。

  • test.sh
#!/bin/bash

TEST="/test/test2/test3__test__"
VALUE="__test__"
REPLACE_VALUE="/test/test2/test3"

TMP=`echo ${TEST} | sed -e "s/__test__/${REPLACE_VALUE}/g"`
echo "${TMP}"


実行、エラー orz

$ bash test.sh
sed: 1: "s/__test__//test/test2/ ...": bad flag in substitute command: 't'


うむむ、、、、


ちなみにコマンドライン上ではこうすれば問題はない

$ REPLACE_VALUE="\/test\/test2\/test3"
$ echo "/tes/test/test__test__" | sed -e "s/__test__/${REPLACE_VALUE}/g"
/tes/test/test/test/test2/test3


つまりは、エスケープしてあげればいいのだ。


こうすればよい。

  • test.sh
#!/bin/bash

TEST="/test/test2/test3__test__"
VALUE="__test__"
REPLACE_VALUE="\/test\/test2\/test3"

TMP=`echo ${TEST} | sed -e "s/__test__/${REPLACE_VALUE}/g"`
echo "${TMP}"

実行してみる。

$ bash test.sh
/test/test2/test3/test/test2/test3


しかし、やりたいことはもう少し延長した話。


変数に一度ディレクトリパスを格納して、その後にエスケープしたいのだ。


しかし、シェルスクリプトは何故か追記しても動いてくれない。

  • test_2.sh
#!/bin/bash

TEST="/test/test2/test3__test__"
VALUE="__test__"
# ハードコーディングじゃなくて、コマンドでやる
TMP_REPLACE_VALUE="/test/test2/test3"
REPLACE_VALUE=`echo "${TMP_REPLACE_VALUE}" | sed -e "s/\//\\\//g"`

TMP=`echo ${TEST} | sed -e "s/__test__/${REPLACE_VALUE}/g"`
echo "${TMP}"


実行

$ bash test_2.sh
sed: 1: "s/__test__//test/test2/ ...": bad flag in substitute command: 't'


うむむむ・・・・


でも、少し覚えがある。


なぜか知らないけど、シェルスクリプトでのエスケープ文字は複数記述しないといけなかったような。。。


ということで、どこまで追加すればいいのかチェックしてみた。


試した結果を全部載せようとしましたが、面倒くさいので結果だけ。

  • test_2.sh
#!/bin/bash

TEST="/test/test2/test3__test__"
VALUE="__test__"
TMP_REPLACE_VALUE="/test/test2/test3"
# どんだけ〜\(^o^)/
REPLACE_VALUE=`echo "${TMP_REPLACE_VALUE}" | sed -e "s/\//\\\\\\\\\//g"`

TMP=`echo ${TEST} | sed -e "s/__test__/${REPLACE_VALUE}/g"`
echo "${TMP}"


実行

$ bash test.sh
/test/test2/test3/test/test2/test3


全部でエスケープは9つ必要なことがわかりました! できてよかったー(棒)



(もうちょっと少なかった覚えがあるんだけどなぁー、、、思い出せん)


とりあえず、できたのでメモ。


ちなみに、後日、なぜこうなるのかを調べてみたいと思います。