Bash True / False Testのロジックは何ですか?

Bash True / False Testのロジックは何ですか?

これ:

$ echo $VAR
something

これ:

$ [[ -z "$VAR" ]]
$ echo $?
1

しかし、これは:

if [[ -z "$TMUX_MAN_PANE" ]]; then
   echo 'NEVER PRINTS!'

これは私の頭を壊した。

修正する

以下は実際のコードです。私はそれを動作させることはできません。

tmux_man_page() {
if [[ "$TERM" =~ 'screen' ]] && [[ -n "$TMUX" ]]; then
  tmux list-panes -t $TMUX_MAN_PANE &> /dev/null
  echo $?
  echo $TMUX_MAN_PANE
  [[ -z "$TMUX_MAN_PANE" ]]
  echo $?
  if ! [[ -z "$TMUX_MAN_PANE" ]] && [[ $? ]]; then
    echo luck
    tmux -q respawn-pane -k -t $TMUX_MAN_PANE man $1
  else
    echo fuck
    tmux split-window -vf man $1
    TMUX_MAN_PANE=$(tmux display-message -p "#{pane_id}")
    export TMUX_MAN_PANE
    tmux select-pane -t {last}
  fi
fi
}

アップデート2:成功

ついに調べました。 if文の最初の行の状態を取得する際に問題があります。 ifステートメントの最初の行からtmuxステートメントの出力を取得するには、いくつかのトリックを実行する必要があります。これを行うためのよりきれいな方法を知っている人がいるなら、誰もが耳を傾けます。

作業コードは次のとおりです。

tmux_man_page() {
if [[ "$TERM" =~ 'screen' ]] && [[ -n "$TMUX" ]]; then
  fucker=$(tmux list-panes -t $TMUX_MAN_PANE 2>&1)
  if ! [[ -z "$TMUX_MAN_PANE" ]] && ! [[ $fucker =~ 'find pane' ]]; then
    tmux -q respawn-pane -k -t $TMUX_MAN_PANE man $1
  else
    tmux split-window -vf man $1
    TMUX_MAN_PANE=$(tmux display-message -p "#{pane_id}")
    export TMUX_MAN_PANE
    tmux select-pane -t {last}
  fi
fi
}

tmux_man_page_close() {
  if [ $TMUX_MAN_PANE ]; then
     tmux kill-pane -t $TMUX_MAN_PANE
  fi
}

答え1

鍵は、これが0真を意味し1(またはゼロ以外の値)、偽を意味することです。

シェルで真であるテスト(または正常に完了したプログラム)は、コード0で終了します。テストは空の場合は[[ -z "$VAR" ]]コード0(true)を返し$VAR、空でない場合はコード1(false)を返します。

$ var=""; [[ -z "$var" ]]; echo $?
0
$ var="NOT EMPTY"; [[ -z "$var" ]]; echo $?
1

要約すると、$VARnull以外の場合は[[ -z "$VAR" ]]false(returns 1)で、thenステートメントは実行されません。

変数がnullでない場合は、テストでtrueを返すようにしますか?その場合は、-z次のように置き換えてください-n

$ var=""; [[ -n "$var" ]]; echo $?
1
$ var="NOT EMPTY"; [[ -n "$var" ]]; echo $?
0

-n簡潔にするために省略されても同じテストが実行されます。

$ var=""; [[ "$var" ]]; echo $?
1
$ var="NOT EMPTY"; [[ "$var" ]]; echo $?
0

関連情報