如何测试一个变量在 bash 中是否有多个非空行?

jpm*_*c26 10 bash

假设我在 bash 中有两个变量:

MULTILINE="I have
more than one line"
SINGLE_LINE="I only have one line
"
Run Code Online (Sandbox Code Playgroud)

我想检测变量何时实际包含多行文本,而忽略额外的尾随换行符。

所以这:

if [ some test on "$MULTILINE" ]; then echo 'yes'; else echo 'no'; fi
Run Code Online (Sandbox Code Playgroud)

会打印yes,这个:

if [ some test on "$SINGLE_LINE" ]; then echo 'yes'; else echo 'no'; fi
Run Code Online (Sandbox Code Playgroud)

会打印no

对于我的具体情况,我认为我不需要担心引导空行,但知道如何做到这一点也无妨。

我怎样才能做到这一点?

Han*_*nnu 5

$ echo "$MULTILINE" | wc -l
2

$ echo "$SINGLE_LINE" | wc -l
2

$ echo "$SINGLE_LINE" | sed -re '/^$/d' | wc -l
1

$ echo "$MULTILINE" | sed -re '/^$/d' | wc -l
2

有关 如何使用 sed 修剪/删除空格和空行的更多信息,请参阅/sf/ask/1149008731/

现在在引号内写下您的if expression ...使用 $( ... )以获取行数,并针对该数字进行测试:

if [ "$(echo "$MULTILINE" | sed -re '/^$/d' | wc -l)" -gt 1 ]; 然后
  echo '不止一行'; 
别的 
  echo '单行或无行'; 
菲


ric*_*ici 5

我知道的最简单的解决方案是:

if (( $(grep -c . <<<"$MULTILINE") > 1 ))
Run Code Online (Sandbox Code Playgroud)

例如:

VAR="a
b"
if (( $(grep -c . <<<"$VAR") > 1 )); then
  echo VAR has more than one line
else
  echo VAR has at most one line
fi
Run Code Online (Sandbox Code Playgroud)

==>

VAR has more than one line
Run Code Online (Sandbox Code Playgroud)

以上忽略了所有空行:前导、尾随和内部。但是要注意,除非至少有两条非空行,否则不可能有内部空行,因此它的存在并不能改变修剪前后空行后是否有不止一行的问题。