仅当当前终端线不为空时才将新线路回到终端

时间:2013-08-15 00:24:37

标签: bash terminal

在bash中,我想有条件地回显一个新行,具体取决于终端中的当前行是否为空。

比方说,例如, first.sh 首先运行,但我无法控制它,而且每次都不知道它会打印什么。我是否可以 second.sh 始终在全新的产品线上开始打印,并且不要在其上留下任何空白行?

first.sh

#!/bin/bash

let "n = 1"
max=$((RANDOM%3))
while [ "$n" -le "$max" ]
do
  printf "%s" x
  let "n += 1"
done

second.sh

#!/bin/bash

#if [ not_in_first_terminal_column ]
#  echo
#fi
echo "Hola"

我想要以下输出之一

$ ./first.sh && ./second.sh
Hola
$ ./first.sh && ./second.sh
x
Hola
$ ./first.sh && ./second.sh
xx
Hola

但不是

$ ./first.sh && ./second.sh

Hola
$ ./first.sh && ./second.sh
xHola
$ ./first.sh && ./second.sh
xxHola

有可能做我想要的吗?我想使用ANSI转义码,类似于here,但我还没找到方法。

1 个答案:

答案 0 :(得分:0)

使用-n:

测试变量的值是否为空
[[ -n $VAR ]] && echo "$VAR"

# POSIX or Original sh compatible:

[ -n "$VAR" ] && echo "$VAR"

# With if:

if [[ -n $VAR ]]; then
   echo "$VAR"
fi

if [ -n "$VAR" ]; then
   echo "$VAR"
fi

它实际上相当于[[ $VAR != "" ]]! [ "$VAR" = "" ]

此外,在Bash中,如果只填充空格,则可以测试它:

shopt -s extglob  ## Place this somewhere at the start of the script

[[ $VAR == +([[:space:]]) ]] && echo "$VAR"

if [[ $VAR == +([[:space:]]) ]]; then
     echo "$VAR"
fi

使用[[:blank:]]仅匹配空格和制表符,而不是新行和喜欢的内容,如果它更有帮助。

如果要从输入文件或管道中删除空行,可以使用其他工具,如sed:

sed -ne '/^$/!p' file... | sed -ne '/^[[:space:]]*$/!p'