Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何测试shell脚本中的行是否为空?_Bash_Shell_Sh - Fatal编程技术网

Bash 如何测试shell脚本中的行是否为空?

Bash 如何测试shell脚本中的行是否为空?,bash,shell,sh,Bash,Shell,Sh,我有这样一个shell脚本: cat file | while read line do # run some commands using $line done 现在我需要检查该行是否包含任何非空白字符([\n\t]),如果不包含,则跳过它。 我该怎么做?bash: if [[ ! $line =~ [^[:space:]] ]] ; then continue fi 使用done

我有这样一个shell脚本:

cat file | while read line
do
    # run some commands using $line    
done
现在我需要检查该行是否包含任何非空白字符([\n\t]),如果不包含,则跳过它。 我该怎么做?

bash:

if [[ ! $line =~ [^[:space:]] ]] ; then
  continue
fi

使用
done
而不是
cat file | while
,除非您知道为什么要使用后者。

由于默认情况下
read
读取以空格分隔的字段,因此只包含空格的行将导致为变量分配空字符串,因此,您应该能够跳过空行,只需:

if ! grep -q '[^[:space:]]' ; then
  continue
fi
[ -z "$line" ] && continue

cat
i在这种情况下,如果使用while read循环,则无效。我不确定您的意思是要跳过空行,还是要跳过至少包含空白的行

i=0
while read -r line
do
  ((i++)) # or $(echo $i+1|bc) with sh
  case "$line" in
    "") echo "blank line at line: $i ";;
    *" "*) echo "line with blanks at $i";;
    *[[:blank:]]*) echo "line with blanks at $i";;
  esac
done <"file"
i=0
而read-r行
做
带sh的((i++)或$(echo$i+1 | bc)
大写“$line”
“)echo”第行的空行:$i;;
*“*)echo”行,空格为$i;;
*[[:blank:][*)回显“在$i处空白的行”;;
以撒
完成试试这个

while read line;
do 

    if [ "$line" != "" ]; then
        # Do something here
    fi

done < $SOURCE_FILE
读行时
;
做
如果[“$line”!=”;然后
#在这里做点什么
fi
完成<$SOURCE\u文件
blank=`tail-1`
如果[-z“$blank”]
然后
回音“行的结尾是空白行”
其他的
回声“他们的是最后一行的东西”
fi

我需要在bash和sh中都能工作的smth。是否有使用sh/sed/tr的解决方案(如果没有安装bash)?这样做有效,另一个([-z“$line”]&&continue)不起作用。我想知道为什么。(更准确地说,
read
使用的分隔符是由
IFS
变量决定的,该变量默认为空白。只需取消设置
IFS
即可恢复使用空白。)更简单的是:如果使用bash的[[语法:
[-z$line]],则无需引用行&&continue
@pihentagy-um,它有相同的字符数,方括号
[]
比一些国际键盘上的引号更难输入,而且它变得特定于bash。因此可能不是更简单,而是一种替代方法。=)(对于像我这样的新手)。
[-z“$line”]&&continue
本身是可执行的。这一行相当于
if[-z“$line”];然后continue;fi
。顺便说一句,不要忘记设置
IFS=“\t\n”
开始时,除非您不想跳过“tab”。如果您建议编辑添加内容,请发布您自己的答案–这回答了原来的问题,并且无论外壳如何,都能非常普遍地工作,因此我不认为如果将更多特定外壳和/或需要beyo的情况复杂化,答案会有所改进原始问题关于方括号表示法的更多信息可以在disadadvantage中找到:如果If中的部分很长,则代码很难阅读。因此,始终建议继续使用解决方案。
blank=`tail -1 <file-location>`
if [ -z "$blank"  ]
then
echo "end of the line is the blank line"
else
echo "their is something in last line"
fi