• ベストアンサー

【シェルスクリプト】 for文で単語分割させたくない

シェルスクリプトのfor文で単語分割させないで、一行ずつ処理させるにはどうすればよいのでしょうか。 ---------- $ ca file test1 test1 test2 test2 test3 test3 ---------- #!/bin/bash for i in `cat file` do echo $i done ---------- 「test1 test1」、「test2 test2」、「test3 test3」といった具合に、行単位で処理したいです。 しかし結果は test1 test1 test2 test2 test3 test3 と単語分割されてしまいます。 空白を含んでいる場合に行単位で処理するにはどうすればよいのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4835/10236)
回答No.2

セパレータはIFSで指定します。デフォルトは、空白・タブ・改行です。 #!/bin/bash IFS=$'\n' for i in `cat file` do IFS=$' \t\n' echo $i done while read i;do echo $i;done < file とやるのが普通です。

skip_jack
質問者

お礼

ご回答ありがとうございました。 セパレータについての知識がありませんでした。 大変勉強になりました。

その他の回答 (1)

  • since1983
  • ベストアンサー率39% (33/84)
回答No.1

bashにはあまり詳しくないのですが、次のようにしてできないでしょうか? ------------------------------------- #!/bin/bash cat file | while read line do echo ${line} done -------------------------------------

skip_jack
質問者

お礼

ご回答ありがとうございます。 cat で流して while させると行単位で扱えますね。 これでできましたが、向学のために、for文で扱う方法をご存知でしたらまたお教えください。

関連するQ&A

  • 【シェルスクリプト】 ローカル変数、グローバル変数

    シェルスクリプトのローカル変数、グローバル変数の取り扱いで迷っています。 ---------------- #!/bin/bash count=0 cat file | while read i do count=`expre $count + 1 ` done echo $count ---------------- fileの中身をcatで流して、それを一行ずつ読み込みます。 そのつど、count の値を増やしていくようにしたいのですが、最後の出力値は0となります。 cat→whileで読み込ませて処理している間はローカル変数として扱われているのでしょうか。 またそうであるならば、シェルスクリプトでグローバル変数を明示的に宣言するにはどうのようにすればいいのでしょうか。

  • for文で変数に格納される文字列 (Bシェル)

    シェルの記述に関しての質問です 例えば、 a1 b1 c1 a2 b2 c2 a3 b3 c3 a4 b4 c4 ・ ・ ・ というスペース区切りの配列が書かれたリストファイル(test.lst)を for VAR in `cat test.lst` do set $VAR echo $1 echo $2 echo $3 done という形で処理しようとします。 そうすると、$VAR に入る変数は "a1" や "b1" といった感じで行単位ではなく、スペース区切りで入ってきてしまい、 $2 や $3 はnullになってしまいます。 これを行単位で $VAR という変数に代入する方法はありますか? 区切り文字はスペースのままとします。 宜しくお願いします。

  • linuxのシェルスクリプト

    linuxのシェルスクリプト シェルスクリプトの質問をどこですればよいのかよくわからないので、ここでさせていただきます。 最近、始めてシェルスクリプトの勉強を始めました。 スクリプトに渡す引数を出力したいと思い、 echo $1 echo $2 echo $3 とかくと、スクリプトに渡した引数が出力されます。 これを、for文で書くと for i in 1 2 3 do echo $i done とねるのですが、これでは1,2,3が出力されてしまいます。 どうなおしたらいいのでしょうか? よろしくお願いいたします。

  • シェルスクリプト

    2月14日頃質問のあった”UNIXのシェルスクリプトを使用してテキストファイルのある列にある特定の文字列を条件としてその行を出力するということをやりたい”を下記のように作ってみました。問題ないか逆質問の形で投稿します。(ルール違反かもしれませんが質問が締め切られているので・・・) #!/bin/bash CAT=YAHOO while read LINE do echo $LINE > tmp.txt DOG=`cut -d" " -f2 tmp.txt` if [ "$CAT" = "$DOG" ] then echo "$LINE" fi done < catalog.file

  • シェルスクリプト中で、ヒアドキュメントで書いた内容を配列に格納したい

    SQL文を実行するシェルスクリプトを作っています。 HAIRETSUにSQLファイル名を格納して、forループで実行させているのですが、現在は下記のようにSQLファイル名を横に並べて書いています。 ------------------------------------------- #!/bin/bash HAIRETSU=( test1.sql test2.sql ) for YOUSO in "${HAIRETSU[@]}" ; do psql testdb1 -f $YOUSO done -------------------------------------------- SQLファイルの数は実際にはもっと多いので、一行につき1ファイルだけ名前を書くようにしたいのです。ヒアドキュメントを使って後述のような方法も試みたのですが、この方法ですと配列が作成されません。 配列を別の処理でも使用したいので、ヒアドキュメントの内容を何とか配列に格納したいのですが、よい方法はないでしょうか? -------------------------------------------- for LINE in `cat << EOF test1.sql test2.sql EOF` do psql testdb1 -f $LINE done

  • shellスクリプトに複数の引数を渡したい

    shellスクリプトに複数の引数を渡したいと考えています。 下記のようなperlスクリプトを兼ねる事でやりたいことは達成できました。 これをシェルスクリプトだけでやろうとしていて、ハマってしまい、やり方がわからなかったので、質問しています。 ・echo.shの中身 $ cat echo.sh echo $1 $2 ・imglist.plの中身 $ cat imglist.pl my@imglist= `ls -1 *{.gif,.bmp,.jpg,.jpeg,.png} 2>1&`; foreach(@imglist){ my@name=split /\./,$_; system("bash ./echo.sh $name[0] $name[1]"); } ・実行すると、無事echo.shに引数が2つ渡る。 $ perl imglist.pl abc1 jpg abc10 png abc11 png abc2 jpg abc3 jpg これをシェルのみでやろうとして、はまってしまいました。 以下は、パイプ処理等を使ったりしてやってみたのですが出来ませんでした。 ・awkでファイル名と拡張子に分解し、パイプで渡そうとしても何故か渡らない・・ $ ls -1 *{.gif,.bmp,.jpg,.jpeg,.png} | awk -F . '{print $1,$2}'| bash ./echo.sh ・ファイルに一旦保存し、catコマンドでパイプで渡しても駄目 $ ls -1 *{.gif,.bmp,.jpg,.jpeg,.png} | awk -F . '{print $1,$2}' > imglist.txt $ cat imglist.txt | bash ./echo.sh ・echoコマンドを使ってパイプで渡しても駄目 $ echo `cat imglist.txt` |bash ./echo.sh ・for.shというファイルを作成し、for構文でimglist.txtの中身を渡すと引数が一つずつしか渡らない $ cat for.sh for id in $(cat imglist.txt); do echo $id done $ bash for.sh tile1 jpg tile10 jpg どうやれば、コマンドライン上やシェルスクリプトだけで、今回はファイル名と拡張子という形で複数行からなる2つの引数を渡すことができますでしょうか

    • ベストアンサー
    • Perl
  • シェルスクリプトからPHP実行

    シェルスクリプト(bash)内で、以下のようにPHPを呼んだ場合、 その次の処理がPHPの終了を待たずに実行されるようなのですが、 どうしてでしょうか? #!\bin\bash /usr/local/php4/bin/php /home/test.php echo "test!" 以上 なぜか test! という表示がPHPの処理中に出るように思えます。

  • コマンド

    以下のシェルスクリプトをパイプ等をつかって1行のコマンドで簡潔に書きたいとき、どう書けばいいでしょうか? $ ./test.sh src dst -- test.sh ---------------- #! /bin/bash src=$1 dst=$2 for i in $(cat ./files) do  何かのコマンド $i $1 $2; done; これを1行のコマンドで書くとしたら??

  • シェルスクリプトについて

    bangou.txtには ▲ 123123 123123 100000 ▲ ▲ というように数値が入っています。(▲は空白ですが改行コードがはいってます) この場合、1行目と3行目を比較するスクリプトを作りたいと思って 色々調べて以下のようなスクリプトを作ってみましたけどうまく動きません。 #!/bin/bash for iii in `sed -n '1p' bangou.txt` do jjj=`sed -n '2p' bangou.txt` kkk=`sed -n '3p' bangou.txt` #declare -i $kkk if [ "$kkk" = "$iii" ] then echo "$iii" else echo "$kkk" fi done どこか基本的なところで間違えているのかと思うのですが初心者なので よくわかりません。 わかる方がいらっしゃったら教えていただけないでしょうか。

  • シェルスクリプトの質問です

    シェルスクリプトの質問です 質問が連続してしまい、もうしわけございません。 1番目から13番目までの引数を表示させようと思い for i in `1 13` do eval echo '$'$i done をかいたのですが、10番目からは不正確になってしまいます。どうしてでしょうか? どなたかご教授お願いいたします。