Linux bash脚本if语句未显示true

Linux bash脚本if语句未显示true,linux,bash,Linux,Bash,在运行resize2fs之前,我正在尝试创建一个快速脚本来检查文件系统 #!/bin/bash var2=$(dumpe2fs -h /dev/mapper/mylv | grep "Filesystem state:") var1=test echo $var1 echo $var2 if [ "$var2" = "Filesystem state: clean" ]; then echo "clean" else echo "dirty" fi 我的结果

在运行resize2fs之前,我正在尝试创建一个快速脚本来检查文件系统

#!/bin/bash
var2=$(dumpe2fs -h /dev/mapper/mylv | grep "Filesystem state:")
var1=test
echo $var1
echo $var2

if [ "$var2" = "Filesystem state: clean" ];
then
        echo "clean"
else
        echo "dirty"
fi

我的结果

Server1:~ # ./filesystest.sh
dumpe2fs 1.38 (30-Jun-2005)
test
Filesystem state: clean
dirty


看起来,即使var2实际上是“Filesystem state:clean”,它仍然显示为false

var2
中可能有额外的字符(可能是空格)

而不是说:

if [ "$var2" = "Filesystem state: clean" ];
说:

编辑:事实上,您的整个脚本可以写成:

dumpe2fs -h /dev/mapper/mylv | grep -q "Filesystem state: clean" && echo "clean" || echo "dirty"
代替此支票:

if [ "$var2" = "Filesystem state: clean" ];
if [[ "$var2" = *"Filesystem state: clean"* ]];
请尝试以下检查:

if [ "$var2" = "Filesystem state: clean" ];
if [[ "$var2" = *"Filesystem state: clean"* ]];

看到dumpe2fs的不同输出,我认为您应该这样检查:

shopt -s extglob
if [[ $var2 == 'Filesystem state:'*([[:blank:]])'clean' ]]
或使用正则表达式:

if [[ $var2 =~ 'Filesystem state:'[[:blank:]]*'clean' ]]
此外,您还可以通过以下方式直接应用该命令:

if dumpe2fs -h /dev/mapper/mylv 2>&1 | grep -q "Filesystem state:[[:blank:]]*clean"
then
如果要获取文件系统的状态,可以执行以下操作:

state=$(exec dumpe2fs -h /dev/mapper/mylv 2>&1 | sed -ne '/Filesystem state:/s/.*state:\s*//p')

执行
回显“$var2”
(带引号)。可能输出中还有其他字符未显示(例如双空格)。请尝试运行w/#/bin/bash-x,它将在运行结果时显示结果。这也会让你看到var2,它可能不是你所想的。所以我只是用这个输出尝试了echo“$var2”。upbcreld03:~#./filesystemest.sh dumpe2fs 1.38(2005年6月30日)测试文件系统状态:clean Filesystem state:clean dirty,因此看起来var2和“var2”不一样。@bashil实际上,
=
(符合POSIX的语法)比
=
(仅在bash中添加的扩展)更正确.@bashophil将==添加到脚本中。在确定是否应在resiz2fs之前执行fsck之前,我正在研究这一点。如果它是干净的,我看不出fsck有什么原因,如果它是脏的或“不干净”,我将运行检查。在上面的命令(见最后一行)中,不要使用
echo“dirty”
,而是使用您的
fsck
命令。如果fs变脏,则执行
fsck
,否则不执行。下一行可用于
resiz2fs
。使用
foo&&foo_was_true | | foo_was_false
就好像它是
if foo;那福佑是真的;否则,福是假的;fi
是一种不好的做法,因为如果
foo\u was\u false
为true,但
foo\u was\u true
失败,则可以运行
foo\u was\u false
。(在
echo
的情况下,想想stdout是一个封闭的FD的情况)。@devnull
code
echo****检查文件系统状态*******var2=$(dumpe2fs-h/dev/mapper/gwvg gwlv|grep文件系统状态:)\var1=test\echo$var1\echo$var2\echo“$var2”如果[“$var2”=”文件系统状态:clean”];然后echo******跳过FSCK******echo***开始调整文件系统大小没有FSCK****调整2fs-d1-f-p/dev/gwvg/mylv-else echo***开始FSCK***e2fsck-f-v-y/dev/gwvg/mylv-fi-echo***发送电子邮件****mailx-s服务器名email@domain.org@=,而不是
=
,即使在
[[]]
的情况下;当这些习惯没有任何价值时,没有必要再去养成它们,因为它们不能带回POSIX。@CharlesDuffy在脚本中添加==。@james,请原谅<代码>=更正确<代码>=是(稍微)错误的(因为它鼓励不符合POSIX的习惯)。