Bash:变量未在 if 中设置

Bash: variable not setting in if

提问人:R3quie 提问时间:11/7/2023 最后编辑:R3quie 更新时间:11/7/2023 访问量:46

问:

第一次尝试 Linux,学习 Bash 只是为了好玩。尝试编写脚本。

这是我的一段代码(bash):

sudo pacman -Suy | if grep --color=always -e "^" -e "there is nothing to do"; then pup=0; else pup=1; fi; 

当我尝试回显变量时,没有任何返回。我已经通过多种方式确认根本没有设置变量。当我尝试将其从 if 语句中设置出来时,echo $var 工作得很好。

这是我的上下文代码的很大一部分:

case $yn in
        [yY] ) echo running only yay -Suy;
           echo running...;
           yay -Suy | if grep --color=always -e "^" -e "there is nothing to do"; then yup=0; else yup=1; fi; 
           break;;
        [nN] ) echo not updating;
           echo exiting...;
           exit;;
        [pP] ) running only pacman -Suy;
           echo running...;
           sudo pacman -Suy | if grep --color=always -e "^" -e "there is nothing to do"; then pup=0; else pup=1; fi;
           break;;
        [bB] ) echo running full sys update;
           echo running...;
           sudo pacman -Suy | if grep --color=always -e "^" -e "there is nothing to do"; then pup=0; else pup=1; fi; 
           yay -Suy | if grep --color=always -e "^" -e "there is nothing to do"; then yup=0; else yup=1; fi;
           break;;
        * ) echo invalid response;;
esac

done

if [ "$pup" -eq 1 ]; then
   echo "Pacman has updated something."
elif [ "$pup" -eq 0 ]; then
   echo "Pacman has not updated anything."
else
   :
fi
if [ "$yup" -eq 1 ]; then
   echo "Yay has updated something."
elif [ "$yup" -eq 0 ]; then
   echo "Yay has not updated anything."
else
   :
fi

成为单行本不是问题。当我用“echo '0'”替换 pup=0 时,它返回 0 没问题。我试着摆弄最后一个if语句,但没有变化。

bash shell archlinux

评论

0赞 Charles Duffy 11/7/2023
管道组件是瞬态的(可以更改 bash 的配置,使最右边的组件不再如此,但必须以非常特殊的方式配置 shell 才能实现这一点)。您的代码设置了变量,但它是在管道完成执行时退出的子 shell 中执行此操作的。
0赞 Charles Duffy 11/7/2023
这是 BashFAQ #24
0赞 pjh 11/7/2023
请参阅如何通过管道将输入传递给 Bash while 循环,并在循环结束后保留变量

答:

3赞 Barmar 11/7/2023 #1

变量赋值位于管道中。它在子 shell 中运行,因此变量赋值不会持久存在。

将管道置于 的条件中,而不是将整个语句放在管道中。例如,更改ifif

... | if grep ... ; then ...; else ...; fi

if ... | grep ...; then ...; else ...; fi