問題ID: 21870

  • フォーラムは新サイトへ移行しました。
  • このフォーラムではゲスト投稿が禁止されています
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2018-12-4 16:02
Pnt399_093  常連   投稿数: 19
問題ID: 21870


問題文を見て解答すれば答えにたどり着くのですが

問題の画像から見ると、

ファイル1とファイル2が「=」の時、

ファイル1と2は違っているので
then [NG] になっていて、

イコールでないときは
elseで[OK]になっているのではないんでしょうか??

もしくは
jpgsEND と jpgs は同じなのでしょうか?
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2018-12-4 17:13
arashi1977  長老 居住地: 広島  投稿数: 1715
質問の意図がいまいちつかめないのですが…
引用:
ファイル1とファイル2が「=」の時、

ファイル1と2は違っているので
then [NG] になっていて、

イコールでないときは
elseで[OK]になっているのではないんでしょうか??
もしかして「条件式の評価」を誤解してませんか?
設問の正答の場合は
if test $STR1 != $STR2
then
   echo "[NG]"
else
   echo "[OK]"
fi
となりますが、この場合1行目のtestによる評価は「変数STR1と変数STR2の内容が一致しなければ真(True)を返す」という意味になります。
1行目の条件評価の結果は、STR1とSTR2の文字列が一致しない(STR1は最後にENDがつく)ので「真」となります。そのため、then以降が実行され、else以降は実行されません。
これは解説にもありますが
引用:
if文は、条件文に記述されたコマンドの終了ステータスを条件分岐に使用します。条件文が真(0)の場合は実行文1、条件文が偽(0以外)の場合は実行文2を実行します。なお、実行文2を記述しない場合は「else」を省略できます。
ということです。

私が質問の意図を読み違えているようであれば、もう少し詳細を教えてもらってもいいですか?
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2018-12-6 6:51 | 最終変更
Pnt399_093  常連   投稿数: 19
条件文1 と 条件文2 が 成立する場合(=)
then が OK になるという事じゃないのでしょうか?

仮に条件文がイコールだとして 二つの条件を「1」「1’」とした場合、
1 と 1’ がイコールだと
then OK が出るという事じゃないんでしょうか

1 ≠ 1’ then NG 
条件文が同じなのにノットイコールだと NG

1 ≠ 2  thne OK 
条件文同じでないものをノットイコールとするとそれは真ではないのでしょうか



今回の場合 1 と 2 の中身が違うので
1 と 2 はそもそもイコールではない

1 と 2 に 「!=」を入れてしまうと、
1と2はそもそも等しくない & != で等しくない
否定の否定をして
2つの条件文は等しくない のにもかかわらず さらに等しくない という事になり
then は 「OK」 となると考えてしまうのですが、違うのでしょうか。

2つの条件文が同じだとすれば、
2つの条件文は同じ それを 「!=」等しくない 
then NG だな、とわかるんですが。


要するに、
1 と 2 が等しくないので
それを「=」でつなげば、 NG でしょう???
と考えてるのです。
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2018-12-6 9:55
arashi1977  長老 居住地: 広島  投稿数: 1715
これで合ってるかな…?

もしかして「条件の評価」や「問題ID:21870の正答や解説について」の話ではなく、問題の中のシェルスクリプトの中身が、日本語的にいえば「STR1とSTR2が間違ってるのに、=で評価したらOKって表示されるのは変だ」って指摘なのでしょうか?

もしそうであれば、例えばこんなシェルスクリプトを作ったとして
$cat check_str_is_same.sh
#!/bin/bash
if test $1 != $2; then
  echo Not Same
else
  echo Same
fi
以下のように実行した場合ってどう思われますか?
$ ./check_str_is_same.sh jpgs jpgsEND
Not Same

$ ./check_str_is_same.sh jpgs jpgs
Same

なお、文字列評価の「=」演算子については問題ID:21869にありますのでそちらも見てみると良いかもしれません。

なし Re: Re: 問題ID: 21870

msg# 1.1.1.1.1
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2018-12-6 11:06
arashi1977  長老 居住地: 広島  投稿数: 1715
あ、待てよ?こういうことか?
引用:
条件文1 と 条件文2 が 成立する場合(=)
then が OK になるという事じゃないのでしょうか?
もしかしてifの判定対象になる「条件文」の範囲を誤解されてる?ifで判定されるのは「条件文1 "演算子" 条件文2」までがひとかたまりですが、そこは大丈夫ですかね?

引用:
仮に条件文がイコールだとして 二つの条件を「1」「1’」とした場合、
1 と 1’ がイコールだと
then OK が出るという事じゃないんでしょうか

1 ≠ 1’ then NG 
条件文が同じなのにノットイコールだと NG

1 ≠ 2  thne OK 
条件文同じでないものをノットイコールとするとそれは真ではないのでしょうか
上記の例示をあえてそのまま使うとそれぞれの演算子を使うと以下のように評価されます。
=(両辺の文字列が同じ場合に「真」を返す)演算子を使う場合
1 = 1 → 「1」と「1」は同じ文字列なので真
1 = 1' → 「1」と「1'」は同じ文字列ではないので偽
1 = 2 → 「1」と「2」は同じ文字ではないので偽

!=(両辺の文字列が異なる場合に「真」を返す)演算子を使う場合
1 != 1 → 「1」と「1」は異なる文字列ではないので偽
1 != 1' → 「1」と「1'」は異なる文字列なので真
1 != 2 → 「1」と「2」は異なる文字なので真
次に条件評価の結果「if〜then〜else」によって処理が分岐します。これは
if 【評価式】
then
  評価結果が「真」の場合の処理
else
  評価結果が「偽」の場合の処理
fi
のように実行されます。

上記を踏まえて
引用:
仮に条件文がイコールだとして 二つの条件を「1」「1’」とした場合、
1 と 1’ がイコールだと
then OK が出るという事じゃないんでしょうか
「条件文がイコール」というのがはっきりしないのですが
→=(イコール)演算子を使用するという意味であれば、21870の正答と異なるので話の前提条件が正しくない
→「1」と「1'」が同じ文字列(イコール)だという意味であれば、21870の正答となる!=(ノットイコール)演算子での評価結果は「偽」となるので、設問のシェルスクリプトではelse以降の処理によって「OK」が表示される
ということでどうですかね?

これで合ってるといいな…
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2018-12-7 10:54
Pnt399_093  常連   投稿数: 19
--------------------------------------
→「1」と「1'」が同じ文字列(イコール)だという意味であれば、21870の正答となる!=(ノットイコール)演算子での評価結果は「偽」となるので、設問のシェルスクリプトではelse以降の処理によって「OK」が表示される
ということでどうですかね?

これで合ってるといいな…

---------------------------------------

そうです、あってるようなあってないような、です。

文字列としては違ってますが
1 と 1’ は同じ内容とします

そうすると、
同じ中身なので、「OK」と表示されるのでは??
と思っていました

●●●●●●●●●●●●●●●●●●●●●●●●●

しかし、この「OK」や「NG」は
文字列の中身を見ているわけではないのですね??

単に2つの文字列があり、
それを等しくないときに真として次の処理に向かわせるものと(!=)、
偽として、真以外を見極め、次の処理に向かわせるものと(=)
単なる分岐と考えればいいわけですよね??



1と2が違うのに、なぜ
それを ノットイコールでつなぐと
NG と表示されるんだ と思っていました

1と2が違う中身ならば、それがノットイコールで合ってるじゃないか
「OK」と、表示されないのは何故???と思っていました


この「OK」「NG」に惑わされないように、と会社の人に教えてもらい
理解できたと思います
これは単なる分岐処理をするためのもの。という認識になりました。
あってますか?

なし Re: Re: Re: 問題ID: 21870

msg# 1.1.1.1.1.1.1
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2018-12-7 11:14 | 最終変更
arashi1977  長老 居住地: 広島  投稿数: 1715
引用:
この「OK」「NG」に惑わされないように、と会社の人に教えてもらい
理解できたと思います
これは単なる分岐処理をするためのもの。という認識になりました。
あってますか?
ですねー
シェルスクリプトの内容を日本語に書き直すとこんな感じなので、それでイメージしてもらったら合うかもしれません。
文字列1に「〜jpg」って入れる
文字列2に「〜jpgEND」って入れる
「文字列1と文字列2を比較(=、もしくは!=)」した結果(真、偽)によって以下の処理を実行する
→真のとき(then)の処理
→偽のとき(else)の処理
1と1'は上記で言い換えると「文字列1」「文字列1'」となります。そして中身はどちらも「〜jpg」であるということになれば、中身が同じで入れ物(の名前)が違うものを比較することになります。ですが、評価されるのは「中身」であって「入れ物の名前」ではありません。
よってこの場合、「=」演算子で評価すれば「真」が、「!=」演算子で評価すれば「偽」が返ってきます。
あとは、それぞれの処理が実行されるだけ、ですね。

ここは悩むより実際にスクリプト書いてやってみるといいかもしれません。大抵のプログラミング言語での条件分岐、比較(評価)は同じような扱いですので、シェルスクリプトに限らない別のプログラミング言語でもお好きなものを試してみるのもいいかと思いますよ

なし Re: Re: Re: Re: 問題ID: 21870

msg# 1.1.1.1.1.1.1.1
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2018-12-7 18:43
Pnt399_093  常連   投稿数: 19
質問しておきながら
自己解決するという形になりましたが、
ありがとうございました

  >フォーラム検索へ


Copyright (c) 2020 Ping-t All rights reserved.