• ベストアンサー

パイプの後半をfor文にする

`コマンド` | for $1 in       do        `コマンド`       done としたいのですが、doからdoneの部分がうまくいかず 構文エラーになります。 パイプ以下を、{}でグルーピングしてもうまくいきません。 `コマンド` | { for $1 in       do        `コマンド`       done; } どうしたらうまくいくでしょうか?

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

  • ベストアンサー
  • PED02744
  • ベストアンサー率40% (157/390)
回答No.1

やりたい事がわかりにくいんですが、 > `コマンド1`|for $1 in > do > `コマンド2` > done というのは、 「コマンド1の出力結果をループしてコマンド2を実行したい」 ということですか? ならば、パイプを使うのではなくて for i in `コマンド1` do `コマンド2` done だとおもいます。 例) for i in `ls *` do echo $i done

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

#1 でもいいけど, 最初のコマンドの標準出力をキャプチャしておきながら分解して for にわたすのはなんかもったいないので, 標準入力から変数に読み込む read を使って コマンド | while read line; do ~ done の方がいいかもしれない (この場合, 読み込んだ内容は変数 $line に入ります). for で in を使うときには, その後ろにリストが必須 (で do の前に for を区切る改行または ; が必要) です. リストを省略するときには in も省略しなければならず, その場合には in $argv と書いたのと同じになります.... $argv だっけ? シェルに対する引数だけど.

関連するQ&A

  • shellのfor文の書き方についての質問です

    使い始めたばかりなので、くだらない質問かもしれないのですが、調べてもわからないのでよろしくお願いします。 shellで、for文を使いたいのですが、その中身が多くて、 for s in 3000 3001 3002 ・・・7999 do 中身 done と打つ以外の便利な方法が知りたいのですが、なにかありますでしょうか??例えば、in の中身を3000から8000未満までと一気に指定出来るような。 よろしくお願いします。

  • For文について (DOS起動)

    テキストファイルの内容を1行ずつ取り出したいと思い、以下のコマンドを実行しました。  for /f %i in (test.txt) do echo %i このコマンドをWin7及びXPのOS上コマンドプロンプトで実行した場合は問題ありませんが、MS-DOS6.22やWin98、WinMEのDOS起動ディスクなどの場合、Syntax errorとなります。 ※test.txtの内容は、TABやSpaceなし、半角英数字のみの文字列で4行程度保存しています。 この為、DOS起動ディスクでは、For文を使えないのかと思い、以下コマンドを実行した所、正常に動作しました。  for %i in (1 2 3 4) do echo %i この事から、For文にてテキストファイルの読み込みが出来ない状況のようです。 どのようにすれば、テキストファイルを読み込む事が出来ますでしょうか。 宜しくお願い致します。

  • MS-DOS: for文で「01」が「1」になってしまいます

    よろしくお願いします。 Windows 2000 Server についての質問です。 for文を使いバッチを組んでいます。 形式は下記です。 FOR /L %変数 IN (開始,ステップ,終了) DO コマンド [コマンドパラメータ] 1.例えば、次のようにバッチファイル(test.bat)に記述します。  for /L %%F IN (%1,1,%2) DO echo %%F 2.そして、次のようにコマンドプロンプトで実行します。  test.bat 01 06 3.エコーとして返るのは、1,2,3,4,5,6 という1桁の数値であり、   01,02,03,04,05,06 という2桁の数値ではありません。   後者のように2桁で返したいのですが、どのようにすれば良いでしょうか。

  • bash forコマンドでソート

    bash forコマンドでソート CentOS8 bashの forコマンドで、ディレクトリ内のファイル名を部分指定した降順でソートした状態で順次読み込みしたいです。 <ファイル> aaa.dat bbbb_0001.dat TEST_0001.file TEST_0002.file TEST_0003.file <アウトプット> TEST_0003.file TEST_0002.file TEST_0001.file 基本的な読込と、lsコマンドの結果を基に読み込む方法はわかりましたが、これに降順ソートを加えるにはどうすれば良いでしょうか? <基本的な読込> for file in /dir1/TEST_*.file do echo $file done <lsコマンドの結果を基に読込> for file in $(ls /dir1/TEST_*.file) do echo $file done

  • dosのfor構文の意味について

    昨日に異なる階層も含めたファイルの一覧表示のやり方について質問させて頂きました。(http://oshiete1.goo.ne.jp/qa4360685.html) その中で以下のコマンドだと目的の一覧が出力できたのですが、初心者のため構文の意味が分かりませんでした。 c:\>for /r c:\folder1 %i in (*.csv) do @echo %~nxi >> list.txt 質問事項といたしましては大きく2点です。 1.for文の構文である「%変数」の変数とは何なのか http://itpro.nikkeibp.co.jp/article/Windows/20051006/222331/ FOR %変数 IN (ファイル名セット) DO コマンド [コマンドパラメータ] 2.一覧表示に使ったコマンドの意味(具体的にはそれぞれの単語(/r,%i,@echo,%~nxi)))です 回答よろしくお願いいたします。

  • コマンド

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

  • bashで変数にパイプを入れ、コマンドとして使う?

    パイプを含む文字列が入った変数をシェルコマンドとして実行する方法がありましたら 教えてください。 Linux環境で、bashを使って定期的にモニタリングするスクリプトを書こうとしています。 スクリプトの引数で実行するモニタリングコマンドを変えれるようにしたいのですが、 パイプが入っているとうまくいきません。 下記のようなスクリプトで、引数に "ps -ef | grep pty" と入れたら、定期的に そのようなコマンドを実行できるようにできますでしょうか? (引数指定時に、きちんとクォーテーションで全体を囲んで、パイプが評価されない ようにしてもダメでした。) 変数として入ったコマンドを実行するときに、パイプがシングルクォーテーションで 囲まれて "ps -ef '|' grep pty" のようになってしまい、パイプとして実行時に認識 されないようです。 bashシェルで設けてる制約でしょうか?回避策などありますでしょうか? <<スクリプト poll.sh>> ## # Defs export RUNCMD='finger' export INTERVAL=10 ## # Getopt while getopts "t:" OPT; do case ${OPT} in t) INTERVAL=${OPTARG};; esac done shift $((OPTIND-1)) [ ${#} -gt 0 ] && RUNCMD="${*}" ## # Main part while :; do (set -x; ${RUNCMD}; sleep ${INTERVAL}); done

  • MSDOSのfor文

    DOSコマンドのFOR文で結果を出力させるにはどういう記述をすればよいでしょうか? 実行させたいのは、 for /d %%a in (ファイルパス\*) do del "%%a\*.cab" という内容なのですが、末尾に「>> log.log」だとうまく出力されません。 ""で囲った中にしてみてもやはり同じ状況なのですが、どうにか出力させることはできないでしょうか?

  • 一行でdoループ

    debian wheezy で 一行でdoループをやろうとしたのですが、失敗します。 $ for i in {1..2} ; do ; pwd ; done bash: 予期しないトークン `;' 周辺に構文エラーがあります $ echo $SHELL /bin/bash $ echo $BASH_VERSION 4.2.37(1)-release なぜうまくいかないのでしょうか? 教えてください。 よろしくお願いします。

  • バッチファイルのfor文の使い方がわかりません。

    バッチ初心者です。 指定したフォルダのテキストファイルを一括置換するバッチファイルを作成したのですが、 for文を使うところでつまづいてしました。 for文のin( )内にディレクトリを入れると失敗してしまいます。 失敗例↓ for %%f in (d:\aaa\*.txt) do ( set fname=%%f set fname=!fname:%1=%2! ren %%f !fname! ) for文を for %%f in (*.txt) にすると成功します。 IN( )内にディレクトリを入れると処理が失敗するのはなぜでしょうか?? helpを読んでもわかりません。 試しにオプション付けて for /r d:\aaa %%f in (*.txt) do echo %%f を実行すると成功するので、 for /r d:\aaa %%f in (*.txt) do ( ・・・・ ) にしてみましたが、成功しません。。。