在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,但我还没找到方法。
答案 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
'