質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

1回答

1423閲覧

linux shell, perl で実行すると変な文字が出てくる。

strike1217

総合スコア651

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2017/05/14 11:12

C

1#include <stdio.h> 2#include<string.h> 3#include<stdlib.h> 4#define LOOP 126 5 6int main(){ 7 char buffer[1024]; 8 int i = 0, j = 0, cry = 0, VALUE = 13; 9 10 printf("ROT_VALUE : "); 11 scanf("%d", &j); 12 13 printf("crypted : "); 14 scanf("%s", buffer); 15 16 printf("BruteForce_original :\n"); 17 18 for(VALUE = 1; VALUE <= j; VALUE++){ 19 printf("%02d : ", VALUE); 20 for(i = 0; i < strlen(buffer); i++){ 21 // cry = atoi(*(buffer + i)) + VALUE; 22 if((*(buffer + i) + VALUE) >= LOOP) 23 printf("%c", (*(buffer + i) + VALUE) - LOOP + 32); 24 else 25 printf("%c", *(buffer + i) + VALUE); 26 } 27 printf("\n"); 28 } 29}

プログラムはあまり関係がないのですが、一応載せておきます。
シーザー暗号をブルーとフォースで解読するものです。

平文 : you will make me happy
crypted : (|$-&vyy-znxr-zr-un}}(

これを、

BASH

1perl -e 'print "112\n(|$-&vyy-znxr-zr-un}}(\n"' | ./solve_caesar | grep happy 281 : yo#will make me happy 3 4echo '112\n(|$-&vyy-znxr-zr-un}}(\n' | ./solve_caesar | grep happy 581 : you will make me happy

ちゃんと、実行して動いているのですが、echoの方は問題がありません。

perl -e の方の実行結果がおかしく、"#" が入っています。

なぜでしょうか??
分かる方教えてください。

ちなみに、print を使った結果は、echoと同じく大丈夫でした。

Linux 64bit shell はBashではなくzshを使っています。
shellの種類はあまり関係はないと思います・・・・

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

$- を変数だと思ってるんじゃないでしょうか?

投稿2017/05/14 11:22

Zuishin

総合スコア28656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2017/05/14 11:31

ほおお では、すればよいのでしょうか?
Zuishin

2017/05/14 11:35 編集

確かにシングルクォーテーションになっているかどうか確かめてください。 なっているなら違います。 私にはダブルクォーテーションに見えます。
strike1217

2017/05/14 11:37

シングルクオーテーションとダブルクオーテーション両方使用しております。
Zuishin

2017/05/14 11:38

ほおお Perl に渡っているのはダブルです。こちらをシングルに変えてください。 つまり、\n が改行になるような文字列ではだめです。
strike1217

2017/05/14 11:39

perl -e 'print "112\n(|$-&vyy-znxr-zr-un}}(\n"' こうです。 外側がシングルで、内側がダブル
Zuishin

2017/05/14 11:40

だから内側をシングルにしてください。
Zuishin

2017/05/14 11:42

外側のシングルクォーテーションはシェルによって解釈されます。 Perl が解釈するのは内側だけです。
Zuishin

2017/05/14 11:42

解釈するというのは、クォーテーションをという意味です。 もちろん中身の文字列は Perl に渡ります。
strike1217

2017/05/14 11:42

ダメですね。 内側と外側のシングルとダブルを入れ替えると、さらにおかしな文字列になり、 外側と内側の両方をシングルにすると、>で入力画面が出てきます。
Zuishin

2017/05/14 11:43

入れ替えただけではそうなるでしょうね。 エスケープしてください。
strike1217

2017/05/14 11:44

エスケープ?? なんですか? それは?
Zuishin

2017/05/14 11:49

じゃあまあとりあえず perl -e 'print q/112\n(|$-&vyy-znxr-zr-un}}(\n/' | ./solve_caesar | grep happy でどうですか? 改行はもちろんされません。\n は \n と表示されます。 Perl のリテラルと変数展開とエスケープについては後で調べてください。
strike1217

2017/05/14 11:56

あああ~~ なるほど! 112 と (|$-&vyy-znxr-zr-un}}( の文字列は改行する必要があるんですよ。 $- が変数と見なされているのは、間違いないですね。
Zuishin

2017/05/14 11:57

文字列の連結を使ってください。
Zuishin

2017/05/14 12:07

Perl の文字列連結はピリオドです。"abc" . 'def' で 'abcdef' になります。
strike1217

2017/05/14 12:07

perl の $- はbashの変数とは別物ですよね??
Zuishin

2017/05/14 12:12

別物です。シェルでなく Perl の文字列連結を使ってください。
strike1217

2017/05/14 12:16

perl -e 'print q/(|$-&vyy-znxr-zr-un}}(/'.'print "112\n"' 112 (|$-&vyy-znxr-zr-un}}(1% 最後に、1% という変な文字が出てきます。
Zuishin

2017/05/14 12:20

perl -e 'print "112\n" . q/(|$-&vyy-znxr-zr-un}}(/ . "\n"' を試してみてください。
strike1217

2017/05/14 12:30

おおお!! なるほど! そうやって連結するんですね!
strike1217

2017/05/14 12:31

できました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問