bash 如何测试真/假背后的逻辑是什么?

Ste*_*ieD 2 bash

这个:

$ echo $VAR
something
Run Code Online (Sandbox Code Playgroud)

和这个:

$ [[ -z "$VAR" ]]
$ echo $?
1
Run Code Online (Sandbox Code Playgroud)

然而这个:

if [[ -z "$TMUX_MAN_PANE" ]]; then
   echo 'NEVER PRINTS!'
Run Code Online (Sandbox Code Playgroud)

这与我的头拧在一起。

更新

这是一些真正的代码。我不能让它工作。

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
}
Run Code Online (Sandbox Code Playgroud)

更新 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
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*024 7

关键是这0意味着真,1(或任何其他非零值)意味着假。

在 shell 中,为真的测试(或成功完成的程序)以代码 0 退出。[[ -z "$VAR" ]]如果$VAR为空,则测试返回代码零(真),如果不为空,则返回代码一(假):

$ var=""; [[ -z "$var" ]]; echo $?
0
$ var="NOT EMPTY"; [[ -z "$var" ]]; echo $?
1
Run Code Online (Sandbox Code Playgroud)

总之,如果$VAR非空,[[ -z "$VAR" ]]则为假(返回1)并且then语句不执行。

如果变量非空,您是否打算让测试返回 true?如果是这样,请替换-z-n

$ var=""; [[ -n "$var" ]]; echo $?
1
$ var="NOT EMPTY"; [[ -n "$var" ]]; echo $?
0
Run Code Online (Sandbox Code Playgroud)

为简洁起见,如果-n省略,则执行相同的测试:

$ var=""; [[ "$var" ]]; echo $?
1
$ var="NOT EMPTY"; [[ "$var" ]]; echo $?
0
Run Code Online (Sandbox Code Playgroud)