• 締切済み

bash Linux CentOS

bash Linux CentOS 標準入力から入力された文字列を配列に格納する。 「quit」が入力された場合は、これまで配列に格納した内容を全て表示して、処理を終了する。 1。 以下の処理を繰り返す 2.入力 3.入力は「QUIT」ならば6へ飛ぶ 4.入力データを配列に格納する 5。1へ戻る 6.配列に格納されたデータを表示する といったものを作りたいのですがうまく格納できなくて… 皆さんのお力を貸してください><;

みんなの回答

回答No.4

★No.2 改良(?)版 ------ IFS=$'\n' eval 'x=($(sed /^QUIT$/Q))' echo ${x[@]} ------ * No.2 だと、キーボードから入力する場合に、QUIT を入力した後に C-d (EOF) などを押してストリームの末端である事を知らせないとなりません。代わりに、"Q" にしてその場で即終了する様にしました。 * あと /QUIT/ だと、部分文字列として含まれている場合(例: DO_NOT_QUIT)にも終了してしまうので、/^QUIT$/ にしました。 * 後、行の中に空白があっても分割されたくない様に IFS=$'\n' を指定しています。 ★配列 x の中身を、空白区切ではなく改行区切で出力したい場合は、例えば、 ------ IFS=$'\n' eval 'echo "${x[*]}"' ------ で。 ★bash の組み込み機能だけで実現したい場合は No.1 で良いかと思います。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.3

とりあず。bash の仕様を調べて作ってみました。 #!/bin/bash ARRAY1=() while : do read in if [ $in = 'QUIT' ]; then break fi ARRAY1=("${ARRAY1[@]}" $in) done for (( i = 0; i < ${#ARRAY1[@]}; i++ )) do echo ${ARRAY1[$i]} done

参考URL:
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11134323636
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

具体的に、どこがどうわからないのでしょう? 配列の使いかた、ループの作り方、みんなマニュアルに載っています。 ある程度作ったのなら、それを掲載して、他の人に見てもらうのもよいでしょう # 配列の宣言 declare -a x # 配列に入力 x=($(sed '/QUIT/,$d')) # 全部出力 echo ${x[@]}

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.1

while read a && test "$a" != QUIT do x=("${x[@]}" "$a") done for((i=0;i<${#x[@]};i++)) do echo "$i : ${x[$i]}" done 表示は、単に表示するだけなら、 echo ${x[@]} でもいいです。

関連するQ&A

  • 文字列の検索と比較

    文字列の検索と比較 以下の手順に従ってプログラムを作成せよ.適宜printf を利用して,入力支援(「文字列を入 力して下さい」などの画面表示)を行うこと. (1) 文字配列name[5][64] を作成する. (2) キーボードから5 人分の名前を入力し,name 配列に格納する. (3) キーボードから名前を入力し,name 配列の何番目に格納されているかを検索して表示 する.ただし,見つからなかった場合には,「見つかりません」と表示する. (4) 「quit」が入力されるまで(3)の処理を繰り返す. という処理です・・・・・。 #include <stdio.h> int main(void){ char name[5][36]; int i; for(i = 0; i < 5; i++ ){ printf("%d番目の名前を入力:", i + 1); scanf("%s", name[i] ); } printf("五人の名前を入力しました。\n"); printf("どこに格納されているか検索します。名前を入力:"); scanf("%s",name); /* ここに配列の何番目に格納されているかを検索して表示するプログラムを作成する ただし,見つからなかった場合には,「見つかりません」と表示する. 「quit」が入力されるまで処理を繰り返す処理を書く?? */ getchar(); getchar(); return(0); } 検索された文字と入力された文字が同じであることの処理はどうすればいいのでしょうか? 二つの配列を用意してループ文?でしょうか?

  • C言語・標準入力でquitを入力で終わるプログラム

    C言語標準入力でquitを入力で終わるプログラムを作っているのですが うまくいきません #include <stdio.h> int main(void) { int i, n; double data[100]; printf("数字を入力してください。\n"); printf("入力を終えるときにはCtrl-dを押してください。\n"); n = 0; while (scanf("%lf", &data[n]) != EOF) { n++; } for (i=0; i<n; i++) { printf("data[%d] = %f\n", i, data[i]); } return (0); } と今はとりあえづ作ってみたのですが 今のままではCtrl-dでループから抜ける形になっています strcmp関数を使うとは思うのですが strcmp関数はchar型なのでエラーが出てしまいます; このやり方じゃないchar型にしてやり直さないといけないでしょうか; Linux CentOS gcc でやっています 標準入力で数字を入力しそれを格納 quitを入力するまで繰り返す quitを入力で終了、これまで格納していた文字列の表示 簡単なプログラムの流れとしては上記の感じです よろしくお願いします。

  • Bashでキーボードから入力は?

    Linux+BashでShellスクリプトを作成しています。 「削除しますか?(Y/N)」のメッセージを表示した後、 Yを押すとファイルを削除するようにしたいと思っていますが、Bashでキーボードから文字を入力して文字がYかNか判断するようなことはできるのでしょうか。 具体的なソースがご存知の方教えてください。 よろしくお願いします。

  • CentOS bashシェルの表記意味

    下記のようなbashシェルの表記が理解できません。 ______________ #!/bin/bash clmline=8 file=testfile2 tmp='temp.txt' sed -e "${clmline},\$d" ${file} ______________ linuxを勉強中の初心者です。 会社にあるシェルを理解する為に、自宅にてテストで作成しています。 sed -e"1,2d" ファイル名 でファイル名の1~2行目を削除する意味と思われますが、 『 ${ } 』 としている意味、及び『 \$d 』の意味が理解できません。 そして、自宅のcentosでは『 \ 』が『バックスラッシュ』となり入力できません。 キーボード設定は下記となります。 $ cat keyboard KEYBOARDTYPE="pc" KEYTABLE="jp106" ご教授よろしくお願いいたします。

  • 入力された文字列を一文字ずつ配列に格納する方法

    例えばABCって文字列が入力されたら配列に data[0]="ABC" と格納するのではなく data[0]="A" data[1]="B" data[2]="C" と格納するにはどう書けばいいのでしょうか?

  • C言語

    以下のC言語のプログラムを教えてください。 お願いします。 (1)標準入力から文字列(2 文字以上)を入力し,文字数を計上すると共に,入力された文字列の逆順に入れ替える処理を実現してください.なお,以下の要件を満たしたプログラムを作成してください. ・ 入力された文字列は,char 型の配列(要素数50)で受け取ること ・ 文字数を計上するcount 関数(引数:配列のアドレス,戻り値:文字数)を定義 し,main 関数より呼び出すこと ・ 文字列を逆順に入れ替えるreverse 関数(引数:配列のアドレス,戻り値:無し) を定義し,main 関数より呼び出すこと ・ 標準出力の処理は,main 関数で記述すること 【プロトタイプ宣言】 int count(char *str); void reverse(char *str); 【実行結果】 文字列を入力してください(2 文字以上) apple 文字数 = 5 入れ換え前 apple 入れ換え後 elppa (2)char 型の配列(要素数50)を2 つ宣言し,標準入力から2 つの文字列を入力してください.そして,格納した字列を入れ替える関数(swapstr 関数)を作成し,入れ替え前と入れ替え後の配列内の値(文字列)を配列名とともに標準出力するプログラムを作成してください. 【プロトタイプ宣言】 void swapstr(char *str1, char *str2); 【実行結果】 2 つの文字列を入力してください apple strawberry 入れ換え前 配列str1 = apple 配列str2 = strawberry 入れ換え後 配列str1 = strawberry 配列str2 = apple

  • centos6(LINUX)のソフトのインストール

    centos6にthunderbird-1.0.6.tar.gzをインストールしようと思い、 ファイルだけダウンロードしました。 http://www.rouge.gr.jp/~fuku/tips/linux-thunderbird/ のとおりに端末から、 $ ./thunderbird/thunderbird & とコマンドを打ち込んでも /lib/ld-linux.so.2: bad ELF interpreter: そのようなファイルやディレクトリはありません [1]+ 終了 126 というメッセージが出てきてインストール出来ないようです。 当方、LINUXコマンドに関してはまったくの素人で、 2~3日前にcentos6(×64)をDELL optiplex7401にインストールしたばかりです。 取りあえず、日本語入力には出来ました。 管理→ソフトウェアの追加、削除も出来る事が分かりました。 su コマンドでファイルを実行すると、うまくいく(事もある)事も分かりました。  LINUXに関する知識は今のところそんな所です。 今までwindowを使っていたのですが、便利ですが、マイクロソフト商法に 嫌気がさしてきたので、今後はLINUXに移行しようかと決意しました。 それはともかく、最初で躓いてます。 親切なかた、御教授願います。

  • 配列の参照渡し

    以下のC言語のプログラムを教えてください。 お願いします。 (1)標準入力から文字列(2 文字以上)を入力し,文字数を計上すると共に,入力された文 字列の逆順に入れ替える処理を実現せよ.なお,以下の要件を満たしたプログラムを作 成すること. ・ 入力された文字列は,char 型の配列(要素数50)で受け取ること ・ 文字数を計上するcount 関数(引数:配列のアドレス,戻り値:文字数)を定義 し,main 関数より呼び出すこと ・ 文字列を逆順に入れ替えるreverse 関数(引数:配列のアドレス,戻り値:無し) を定義し,main 関数より呼び出すこと ・ 標準出力の処理は,main 関数で記述すること 【プロトタイプ宣言】 int count(char *str); void reverse(char *str); 【実行結果】 文字列を入力してください(2 文字以上) apple 文字数 = 5 入れ換え前 apple 入れ換え後 elppa $ ---------------------------------------------------------------------------- (2)char 型の配列(要素数50)を2 つ宣言し,標準入力から2 つの文字列を入力せよ. そして,格納した字列を入れ替える関数(swapstr 関数)を作成し,入れ替え前と入れ替 え後の配列内の値(文字列)を配列名とともに標準出力するプログラムを作成せよ. 【プロトタイプ宣言】 void swapstr(char *str1, char *str2); 【実行結果】 2 つの文字列を入力してください apple strawberry 入れ換え前 配列str1 = apple 配列str2 = strawberry 入れ換え後 配列str1 = strawberry 配列str2 = apple

  • 文字を反転させる。

    以下の手順に従ってプログラムを作成せよ.適宜printf を利用して,入力支援(「文字列を入 力して下さい」などの画面表示)を行うこと. (1) キーボードから文字列を入力し,文字配列s[64] に格納する. (2) 文字配列s[64] に格納されている文字列を逆順にしてt[64] に格納する(配列全部を逆 順にするのではなく,NULL 文字までの要素を逆順にする). (3) t[64] を画面表示する. ポインタ使用不可、ヘッダファイル<stdio.h>だけ 入力された文字を反転させるということでしょうか?? #include <stdio.h> int main(void){ int i; char s[256]; char t[256]; printf("文字列を入力:"); scanf("%s" , s); for ( i = 0; i < '\n'; i++ ){ t[i] = s[i]; } printf("文字列の逆順は%s",t); getchar(); getchar(); return(0); } これだとただ入力された文字を出力するだけになってしまいますよね・・・・。どうすればいいのでしょうか?

  • AWKの配列内データの処理について

    AWKを使用して入力ファイルの1行内の単語に対して条件チェックするには for( i=1 ; i<= NF i++ ){    if( $I == chek_word )       処理 } とすればできるのはわかるのですが、 一旦、配列の中に格納した文字列に対して上記の処理と同様の処理をするにはどのようにすればいいのでしょうか? 例えば data_line[$1] = $0; として配列data_lineに格納した1行そのままのデータに対して1番上の行全体にわたる単語の条件チェック をおこないたいのですが、どのようにすればいいのかよくわかりません。 どなたかご存知の方アドバイスをお願いします。