環境変数を実装できるプロジェクト用に C で簡単なシェルをプログラミングします。getenv、setenv、putenv の使い方を調べてみました。これまでのところ、getenvを使用してシェル変数を表示しようとしました...まあ...いくつか成功しました。しかし、私の推論には欠陥があると感じています。char** argv
ユーザー入力からの解析済み入力を含む があります。argv
コマンド「echo」で始まるかどうかを確認し、次の入力のいずれかが$
記号で始まるかどうかを確認します。これが私のコードです:
int executeVariables(char** arguments){
int i = 0;
if(strcmp(arguments[i], "echo") == 0){
char *variable;
for(i = 1; arguments[i] != NULL; i++){
char *str = arguments[i];
if( *(str + 0) == '$'){
variable = getenv(str + 1);
}else{
variable = getenv(str);
}
if(!variable){
//puts("not a variable");
printf("%s ", arguments[i]);
}else{
//puts("a variable");
printf("%s ", variable);
}
}
printf("\n");
exit(0);
}
return 1;
}
$
通常のLinuxシェルは記号を見つけて、echoコマンドを呼び出す前に変数を展開すると思います。私のシェルはこの原則に従っていません。echo コマンド自体の中で変数を展開しています。これをどのように実装できるかについてのアイデアはありますか? ありがとう。
編集:
私が抱えている問題は次echo $HOME
のとおりecho HOME
です。同じ結果が間違っています。
編集:
さまざまなテストの後、すべてがうまく機能します。しかし、実際にテストするには、ローカル変数を作成してからecho
この値を作成する必要があります。関数を使用して試しましたputenv
が、ローカル変数が作成されません。
i = 0;
char** temp = malloc(sizeof (*temp));
if(strstr(userInput, "=") != NULL){
//puts("we got equals");
puts(userInput);
if(putenv(userInput) == 0){
printf("doing putenv(%s)\n", userInput);
exit(0);
}
else{
puts("couldnt putenv");
exit(1);
}
}
userInput:char *userInput
を使用してコマンド ラインから取得した入力です。fgets()