我制作了一个 shell 脚本来备份、查看和恢复 Linux 系统中已安装的软件包。该脚本如下所示:
#!bin/bash
echo ""
read -p "You are about to backup installed packages. Continue (y/n)?:" CONT
echo ""
if [ "$CONT" = "y" ]; then
eval sudo pacman -Qqe | grep -vx "$(pacman -Qqm)" > packages;
else
echo "Ok. I got you, I won't backup";
fi
read -p "View list? (y/n):?" CONT
if [ "$CONT" = "y" ]; then
eval xargs -a packages ;
else
echo "Preparing to restore"
fi
echo ""
read -p "So restore list contents (y/n):?" CONT
echo ""
if [ "$CONT" = "y" ]; then
eval sudo xargs -a packages pacman -S --needed ;
else
echo "Ok. No packages restored!";
fi
该脚本创建一个文本文件,其中包含系统中安装的所有软件包名称,然后提示用户查看列表,最后允许他恢复备份列表中包含的软件包。 然后,我决定使用 C 来做同样的事情。我创建了一个如下所示的程序:
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main() {
char ans[2];
char command[100];
printf("\nYou are about to backup installed packages. Continue (Y/N)?:");
scanf("%1s", ans);
if (strcmp(ans, "Y")==0) {
strcpy(command, "sudo pacman -Qqe | grep -vx '$(pacman -Qqm)' > packages");
system(command);
printf("\nBackup done! \n");
}
else {
printf ("\nGot you, I won't backup \n");
}
}
但是这段代码只能给用户一个选择是否要备份列表的选择。由于 while 循环,如果我尝试在现有 while 循环中添加另一个条件,就会陷入陷阱。
我在这些问题上需要一些帮助才能完成以下条件。 如何为用户提供其他选择,例如:
1) 查看备份列表? 2) 恢复备份列表中包含的包?
举个例子会很有帮助:))
最佳答案
正确的应该是
if(scanf("%1s",ans)!=1){
// error handle
}
这将使您在 strcmp
函数中正确使用它。
或者你可以这样做
if(scanf("%c",&ans[0])!=1){
// error handle
}
ans[1]=0;
然后你可以在strcmp
中使用它或者简单地使用
if(ans[0]=='Y'){
...
}
通过检查scanf
的返回值来了解scanf
调用是否成功。
还可以使用 sprintf
或类似的方法代替 strcpy
,这样就不会遇到缓冲区溢出的情况。在这里您知道长度,但在许多情况下您不会 - 那么使用 sprintf
是很好而且安全的。
如果您在编译器中启用警告,那么您将看到类型不匹配警告。类似的东西
format '%s' expects argument of type 'char *', but argument 2 has type 'char (*)[2]' [-Wformat=]
scanf("%s",&ans);
^
尝试在启用 -Wall -Werror
标志的情况下编译代码。
关于c - C 中的多重条件检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47978025/