俺の人生初の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つ必要なことがわかりました! できてよかったー(棒)
(もうちょっと少なかった覚えがあるんだけどなぁー、、、思い出せん)
とりあえず、できたのでメモ。
ちなみに、後日、なぜこうなるのかを調べてみたいと思います。