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においては扱いが変わってくるので、今回は全てダブルクォートで扱ってください。
また、半角スペースだけでなく、文字列としてダブルクォートがある場合などもあるので、エスケープして対応してください。
0 件のコメント:
コメントを投稿