- 締切済み
UNIXコマンド、変数について
入力された文字を変数としてコマンドへ渡したいのですが上手く行きません 入力された文字列を変数ywcに取り込みsayコマンドで発音させたいのですが 取り込まれたywcの中のある特定の文字だけ除外もしくは置き換えをしたいのですが上手く行きません say '" & ywc & "' とsed -e 's/'//g'を組み合わせれば良いのかな?と思っているのですがなかなか上手く行きません 変数の中に’(シングルクォータ)があるとエラーになる為除外したいというのが理由です もしくは始めから'を変数の中に取り込まないようにはできますでしょうか? コマンドに詳しい方ご教授お願いします Say コマンドはMac固有のコマンドですがコマンドが違うだけで基本とBashは一緒だと思いますのでユーザー数と経験者の多いこちらで質問させてください よろしくお願いします
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- tux_the_penguin
- ベストアンサー率42% (69/163)
#4 です。 書き忘れがありました。重要です。 bashで、変数に値を持たせるには 変数名=値 の形で記述し、その後の空白に続く単語があればコマンドとして実行しようとします。その時に実行環境変数として渡されます。(無論そのコマンドが件の変数を読む読まないは無関係です) 値を省略した場合その変数の中身は空であると定義されます したがって通常は【=】の前後に空白があってはならないのです。 ゆえに#1のお礼に書いてあるラインは真っ先にymcを空にしてからバッククオート内で空のものにたいして処理を試みたのちsayを実行している事になります。 書き忘れの追記のついでですが… ざっとAppleScriptの書き方を調べて見ましたが、【&】は文字列同士を繋ぐときに使われるようで、【 & ymc & 】はAppleScriptでの記述だと想像できるのですがいかがでしょうか? 変数 ymc の値が bar の時 "foo" & ymc & "buz" と書くと "foobarbuz" が得られる。 見つけた「MacのコマンドとApplescriptを解説しているサイト」を晒していただければ読み違いをしているかどうかわかると思います。 bashでの実行を試みている所へAppleScriptの記術をしても意図した動作は期待出来ません。 クオートの組み合わせに加えてスペースの置き方など、環境に応じた正しい書き方を覚えましょう。それができないと#1,3,5さん#2さんが的確な回答をしてくださっているのにそのせっかくのアドバイスが理解できずに前へ進めないと思います。それが#4さんのおっしゃる「一気に実行しては駄目」と言うことです。 蛇足ですが、コマンドラインに何かしらの文字を書くときはそれがコマンドなのか変数名なのか単純に文字列そのものなのかなどを意識して書いてください。
- notnot
- ベストアンサー率47% (4900/10358)
#1,#3です。 よくわからないのに一気に実行しては駄目です。 「ywcに文字列が入っている」ことがまず確認できてないですよね。 #!/bin/bash ywc=can't この段階でエラーが出るはず。あるいは、スクリプトファイルにせず、コマンドラインから1文ずつ実行するほうがいいでしょうね。 #4に書かれているように、シェルの特殊文字はエスケープしないといけません。 ywc=can\'t とか ywc="can't" とか 他の方から、「& がおかしいのでは?」という指摘もあります。私はsayコマンドの仕様をしらないので、質問にお書きの通りが正しいと仮定して回答していますが、コマンドラインから実行して以下は正しいですか? >・say '& aaaaaaaaa &' と言うコマンドで、「ああああ」を発音するのはうまくいく(推測) 頭で「正しいと思っている」と「実行して正しい結果を得た」は大きく違います。
- tux_the_penguin
- ベストアンサー率42% (69/163)
$ echo $ywc | sed s/\'//g | say -f - でよかったりして。 (#2のご回答を別の形に書き直しただけです) 変数を【& 】と【 &】で括るというのは一般的なbashの流儀では無いので避けてみました。 つまりsayに変数の代わりに標準入力を読ませてみる、と。 またコマンド置換が正しく行われればそれもちゃんと動くとも思います。 以下余談。 基本的なところを勘違いしていると思います。 行の中の語句を括る時には、括られる語句の前と後ろに、相応の記号をつけるわけですが、その前の記号と後ろの記号の組み合わせがきちんと決まっています。 【(】の場合は【)】で 【{】の場合は【}】などです #ここまではご存知のとおり ことコマンドラインに関してはこの組み合わせはとても厳格です 誤解なさっているようにみえるのは引用符の場合です 前に【"】(ダブルクオート)がついていれば後ろにも同じ【"】がつかなければならないように、【'】(シングルクオート)の場合も【`】(バッククオート)の場合も前後につくべき記号は同じものです。 バッククオートに始まりシングルクオートで終わっていても、アホなコンピュータは閉じられていないと判断します。我々人間には `この方が見やすい' のでエラーメッセージやmanページにはそういう記術法がとられていますがそれはあくまで人間様のためのものです。【'】で括り始めたら【'】で括り終わらないとならないし、【`】があればもう一つ【`】が必ず無ければなりません。 また、【"】で括る場合に、もし意図する括り終わりより前に【"】があれば(括られる語句の中に同じ引用符があれば)そこが括り終わりとして扱われます。 もう一つ。 人間様はアポストロフィとシングルクオートを見分けることができますが、アホなコンピュータにはそれができません。【'】が出てくると自動的に括り終わりのもう一つの【'】を探し、見つからなければぶーたれます。 なので、【'】が(またはその他のペアとなるべき片割れの記号が)単独のものである事をあらかじめ教えてあげなければなりません。 その教えるための記号が【\】バックスラッシュです(円記号に見える人もいることでしょうが、…以下略) もしくは別の引用符で括ることです。 (…と#2のご回答の冒頭に書いてある) したがって#3のお礼にあるスクリプトは2行めのアポストロフィが括り始めとして処理され、3行めのアポストロフィは前後にペアのダブルクオートが(さらにその外にはペアのバッククオートが)あるので特別扱いされずに通り過ぎ、括り終わりがないままファイル終端に達したとぶーたれています。
- notnot
- ベストアンサー率47% (4900/10358)
#1です。お礼の文の意味がわかりません。とりあえず無視します。 質問から受けとった条件は以下の通りです。 ・ywc に 文字列が入っている ・say と言うコマンドの引数にその文字列を指定したい ・say '& aaaaaaaaa &' と言うコマンドで、「ああああ」を発音するのはうまくいく(推測) ・ywc の文字列に ' が入っていない場合には、say "& $ywc &" でうまく発音できる ・ywc に ' が入っている場合にどうすればいいか? というのが正しいとして、回答は、 ywc=`echo "$ywc" | sed "s/'//g"` で、ywc から ' が削除されるので、その後で、say "& $ywc &" すればいい。 条件が違う場合は、私の書いたものにならって正確に書いてください。
- Murasan759
- ベストアンサー率59% (312/527)
say `echo $ymc | sed "s/'//g"` もしくは say `echo $ymc | sed s/\'//g` ywc= `echo "$ywc" | sed "s/'//g"` | say '" & ywc & "'については 1.ywc= `・・・`は代入文ですが、標準出力への出力はされません。そのあとのパイプ"|"は、その直前のコマンドの標準出力を、その直後のコマンドの標準入力へ渡すものです。なので、パイプを使用する際には、その直前のコマンドが標準出力を有することと、その直後のコマンドが標準入力を受け付けることの2点が必須となります。各コマンドのmanページを見れば、標準入出力に関して記載されています。 2.say '" & ywc & "'は、何を参考にされたのでしょうか?基本的な構文をman bashなどを熟読するなどしておさらいしてみましょう。
お礼
回答ありがとうございました 回答を頂いた物では上手く有りませんでした unexpected EOF while looking for matching ``' syntax error: unexpected end of file というメッセージが出ます say '" & ywc & "' これについてMacのコマンドとApplescriptを解説しているサイトでみつけたものでバックォーターの無い文章ならこれで上手く発音してくれるので間違っては居ないと思います になみに say ' & ywc & ’などとすると「あんどわいだぶるしーあんど」と発音して変数の中身は発音してくれずそれ以外では発音してもくれません 『点と&とスペースの位置』はかならずsay '" &[](変数)[]& "'でなくては駄目なようです
- notnot
- ベストアンサー率47% (4900/10358)
ymc に入っている文字列からシングルクォートを削除して、ymc にセットし直すということでいいですよね。 ymc=`echo "$ymc" | sed "s/'//g"`
お礼
回答頂きありがとうございました あまり理解できていないため上手く行きません ywcにcan'tという文字が入っているとして最終的にはsay cantにしたいという意味になります ywc= `echo "$ywc" | sed "s/'//g"` | say '" & ywc & "' これで何がまちがってますでしょうか? よろしければ再回答頂けると嬉しいです
お礼
再度の回答ありがとうございました notnotさんの推測通りなのですが ややこしくなるのでsayをechoに変えてみます #!/bin/bash ywc=can't ywc=`echo "$ywc" | sed "s/'//g"` echo $ywc とすると以下のエラーで上手く行きません unexpected EOF while looking for matching ``' syntax error: unexpected end of file どうもクォーターとバッククォーターの使い方が上手く無いようなんです
補足
>どうもクォーターとバッククォーターの使い方が上手く無いようなんです 変数の中の