我制作了一个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)恢复备份列表包含的软件包?
一个例子非常有用:))
答案 0 :(得分:0)
正确的是
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
来电是否成功。
也代替strcpy
使用sprintf
或类似内容,以免您遇到缓冲区溢出问题。在这里你知道了长度,但在许多情况下,你赢了 - 这对sprintf
是好的和安全的。
如果在编译器中启用警告,则会看到类型不匹配警告。像
这样的东西format '%s' expects argument of type 'char *', but argument 2 has type 'char (*)[2]' [-Wformat=]
scanf("%s",&ans);
^
尝试编译启用了-Wall -Werror
标志的代码。
答案 1 :(得分:0)
由于while循环,如果我尝试在现有的while循环中添加另一个条件,我会陷入陷阱。
我没有完全明白你在那里说的话(我在那里看不到while
个循环),但这里是我的回答。您可以使用类似的if-else结构来提示用户列出备份并从中还原。您的最终计划将如下所示:
#include<ctype.h>
#include<stdio.h>
#include<stdlib.h>
int main() {
char ans; //You need only a char variable, not an array
printf("\nYou are about to backup installed packages. Continue (Y/N)?:");
scanf(" %c", &ans);
if (toupper(ans) == 'Y') {
system("sudo pacman -Qqe | grep -vx '$(pacman -Qqm)' > packages");
printf("\nBackup done! \n");
}
else
printf ("\nGot you, I won't backup \n");
printf("\nView list? (y/n) ");
scanf(" %c",&ans);
if(toupper(ans) == 'Y')
system("xargs -a packages");
printf("\nSo restore listed contents? (y/n) ");
scanf(" %c",&ans);
if(toupper(ans) == 'Y')
system("sudo xargs -a packages pacman -S --needed");
else
printf("\nOK, no packages restored.");
}
否则,您可以使用基于菜单的方法来解决问题:
#include<stdio.h>
#include<stdlib.h>
void backup(){
system("sudo pacman -Qqe | grep -vx \"$(pacman -Qqm)\" > packages");
printf("\nBackup done!");
}
void list(){
printf("\nHere comes the listing:\n");
system("xargs -a packages");
}
void restore(){
system("sudo xargs -a packages pacman -S --needed");
printf("\nRestore done!");
}
int main(){
char choice;
do{
printf("\nSelect any action from the following:\n\
1. Backup packages\n\
2. List packages\n\
3. Restore packages\n\
4. Exit\
>>> ");
scanf(" %c",&choice);
switch(choice){
case '1': backup();
break;
case '2': list();
break;
case '3': restore();
break;
default : printf("\nIllegal choice!");
}
}while(choice!='4');
return 0;
}
修改强>:
修正了scanf()
错误,请参阅:https://gsamaras.wordpress.com/code/caution-when-reading-char-with-scanf-c/
答案 2 :(得分:0)
我最终这样做了:)
#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(ans[0]=='Y'|| ans[0]=='y') {
sprintf(command, "sudo pacman -Qqe | grep -vx '$(pacman -Qqm)' > packages");
system(command);
printf("\nBackup done! \n");
}
if(ans[0]=='N'|| ans[0]=='n') {
printf ("\nOk. Got you, I won't backup \n");
exit(EXIT_SUCCESS);
}
printf ("\nView list? (Y/N):\n");
scanf("%1s", ans);
if(ans[0]=='Y'|| ans[0]=='y') {
sprintf(command, "xargs -a packages");
system(command);
printf("\n");
}
else {
printf ("\nPreparing to restore \n");
}
printf ("So restore list contents? (Y/N):");
scanf("%1s", ans);
if(ans[0]=='Y' || ans[0]=='y'){
sprintf(command, "sudo xargs -a packages pacman -S --needed");
system(command);
}
else {
printf ("\nOk. No packages restored!\n");
}
}