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

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

新規登録して質問してみよう
ただいま回答率
85.48%
シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

zsh

zshは、UNIX系OSのシェルの1つです。 cshやksn系のコマンドライン編集機能も実装されたシェルです。

Q&A

解決済

1回答

4540閲覧

zshでコマンドの存在を確認に使う二重丸括弧について

mitsuru793

総合スコア157

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

zsh

zshは、UNIX系OSのシェルの1つです。 cshやksn系のコマンドライン編集機能も実装されたシェルです。

0グッド

0クリップ

投稿2016/05/31 09:17

下記で、zshでコマンドを確認する時に(( ${+commands[peco]} ))のような記述を見かけました。commandsはzshが自動で用意している実行できるコマンドを含む連想配列だと思っています。

この時、(( ))を使うメリットはあるのでしょうか?二重丸括弧は(( i++ ))のような計算をする時に使うものだと思っていました。(( $ ))のようにドルを中で使うとプロセス番号を取得できますが、上記の場合はプロセス番号ではなく、変数展開${+val}のドル記号でした。これは変数が存在するなら1、ない場合は0と評価するものです。

二重丸括弧を使わなくても、echo ${+commands[bash]}1と表示させることが出来ました。何かzshでは二重丸括弧を使っておかないと困るようなことがあるのでしょうか?

どうぞよろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ここで,(( )) を利用している理由としては,コマンドが存在するかどうかを調べたいだけであり,$+commands[zsh] の返却値である数字でコマンドを実行したくないからだと思います.

あと,${+commands[$1]} は コマンドが存在すると1存在しないと0を返却します.ただしシェルはコマンドの実行に成功した時0, 失敗した時,0以外が帰ってき, true false が逆になってしまっています.
(( )) で囲うことで, 1 の時 0 が帰ってき, 0 のとき 1 が帰ってきて not 的なことができます.

なぜ,not的な振る舞いが行われるかというと, (( )) 内で右辺を返却した時,内部的に比較が行われます.
冗長的に書くと,(( ${+commands[$1]} ))(( ${+commands[$1]} == 1 )) と同じだからです.
比較に成功すると,コマンドの実行に成功した扱いになり, 1 == 1 で 0 が帰ってきます.

zsh の true と false の扱いと, コマンドの実行成功と失敗の扱いで 0 と 1 が全く逆の意味を指しているのがややこしくなっている原因でしょう.

:?too few argument そしてこれはおそらく可読性を上げるためのコメント文のようなものだと推測します.

: 以下のコマンドは実行されないので.

C言語の

c

1while ( 1 ) { }

とかと同じ感じでしょう.

二重括弧とコロンコマンドについては,http://rcmdnk.github.io/blog/2013/11/13/computer-bash-colon/ などがわかりやすいのではないのでしょうか.

投稿2016/06/10 04:33

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

mitsuru793

2016/06/10 21:10

ご回答ありがとうございます。(( result == 1 ))と内部的に比較が行われていることに驚きました。算術演算するだけではないのですね。これを確認するために下記のコードをためしてみました。 ((0)); echo $? # => 1 ((1)); echo $? # => 0 ((2)); echo $? # => 0 2の時でも0(true)となっているので、(( result != 0 ))のような比較が行われていのかなと思いました。どちらにせよ、上記は論理値の否定を行うためのtipsだったいうことがわかり、大変助かりました。 本当にありがとうございました。
退会済みユーザー

退会済みユーザー

2016/06/11 14:36

ご指摘の通り私の回答の比較式が間違っています.指摘ありがとうございました・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問