Bash 如何测试shell脚本中的行是否为空?
我有这样一个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
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