shellの受け渡し値でスペースを含めたい時の対応

2015年6月23日

Shell プログラミング

shellプログラムを書いている時に、スペース付きで値を受け渡したい時があります。 そんな時の対応をメモしておきます。

基本ソース

get.shというプログラムを作り、後ろにクエリとして受け渡し値をつけると、それを表示するプログラムです。 #!/bin/bash for i in $@ do echo $i done お試し $ sh get.sh aaa bbb ccc aaa bbb ccc

半角スペースを入れたい場合

クォーテーションで対応してみる

“aaa”と”bbb ccc”のようにしたい場合はどうすればいいんでしょう? とりあえず、クォーテーションで囲ってみる $ sh get.sh “aaa" "bbb ccc" aaa bbb ccc ダメでした・・・orz そりゃそうですよね。こんな簡単にできるぐらいなら、僕もブログ記事など書かないです。

バックスラッシュで対応してみる

$ sh get.sh aaa bbb\ ccc aaa bbb ccc ダメでした・・・orz

ダメもとでクォーテーション+バックスラッシュで対応してみる

$ sh get.sh “aaa" "bbb\ ccc" aaa bbb\ ccc もっとダメでした。 \が文字として扱われてしまいます。 その後も、「\\」や「\\\」など、エスケープをとことん試してみましたが、ダメでした・・・

shellプログラム内での文字列の扱いについて

shell内における型は意外とちゃんと対応しないといけなくて、文字列は「”」クォーテーションで囲むことで型を変更することができるという if文の時に、$A == “A"と “$A” == “A”で結果が変わる事からなんとなく対応方法が分かった。

ソース改修して完了

get.sh

#!/bin/bash for i in “$@" do echo $i done さらに、クエリー番号を明確にするために、クォーテーションをつけて実行 $ sh get.sh “aaa" "bbb ccc" aaa bbb ccc できました!! 簡単にできたようですが、shell内部における文字列を認識しておかなければいけません。 変数に入れても、クォーテーションをつけないと文字列扱いされないという事がわかってもらえると、今後トラブらないと思います。

注意点

クォーテーションも「”」ダブルクォートと「’」シングルクォートがあり、シングルの場合はshellにおいては扱いが変わってくるので、今回は全てダブルクォートで扱ってください。 また、半角スペースだけでなく、文字列としてダブルクォートがある場合などもあるので、エスケープして対応してください。

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。