No. | 質問・回答 | おれい |
|
[114241] コマンドについての質問 |
|
|
使用しているOS: Linux
bash シェルについて。
コマンドを打つ時に cat テキストファイル名 | シェルファイル > テキストファイル名(例:cat ex.txt | ./sample_shell.sh > /tmp/out.txt)とする場合、シェルファイルの中で、テキストファイル(例ではex.txt)をどのように指定すればいいかわかりません。理解している方教えて下さい。お願いします。
shell (未登録) 2009年4月15日14:02
|
|
|
|
[114242] |
sample_shell.sh の標準入力になります。sample_shell.sh の中で標準入力として受けてください。
シャイン (30) 2009年4月15日17:00
|
|
|
|
[114245] |
御回答ありがとうございます。しかし、私はシェル初心者なのでまだよく理解できていません。例えば、実行する時に ./sample_shell.sh ex.txt out.txt とすると ex.txt と out.txt は sample_shell.sh の中でそれぞれ$1、$2という形として扱うことができますが、cat ex.txt | sample_shell.sh > /tmp/out.txt とする場合 sample_shell.sh の中ではどのように表現すればよいのでしょうか。
shell (未登録) 2009年4月15日20:57
|
|
|
|
[114250] |
cat ex.txt | sample_shell.sh とすると、sample_shell.sh は cat ex.txt の出力、すなわち ex.txt の中身を標準入力に受け取ります。
シェルスクリプトの中に標準入力を受け取るコマンドを書くと、シェルスクリプトの標準入力を受け取ります。
例えば、sample1.sh を次のようにすると、abc を含む行のみを出力します。
----------------------------
grep abc
---------------------------- cat ex.txt | ./sample1.sh とすると、cat ex.txt | grep abc と同じで、ex.txt の中で abc を含む行を出力します。
read コマンドは標準入力を読み、変数に代入します。
例えば、sample2.sh を次のようにすると、標準入力の1行目のみ表示します。
----------------------------
read line
echo $line
----------------------------
例えば、sample3.sh を次のようにすると、標準入力を一行ずつ変数に代入できます。
----------------------------
while read line; do
echo $line
done
----------------------------
シャイン (30) 2009年4月15日22:48
|
|
|
|
[114281] |
毎度ご解答ありがとうございます。
例えば、ex.txtの行頭が#記号である行以外を/tmp/out.txtに出力するsample_shell.shを
#!/bin/sh
while read LINE
do
case $LINE in
"#"*) ;;
*)echo $LINE >> $2 ;;
esac
done < $1
と作成すると、実行時に cat ex.txt | sample_shell.sh > /tmp/out.txt では $1: ambiguous redirect となって動きません。この時に sample_shell.sh 内でどのようにすればいいのでしょうか。
shell (未登録) 2009年4月17日12:55
|
|
|
|
[114287] |
この場合、$1、$2 はいりません。
#!/bin/sh
while read LINE
do
case $LINE in
"#"*) ;;
*)echo $LINE ;;
esac
done
cat ex.txt | sample_shell.sh > /tmp/out.txt としたとき、sample_shell.sh には引数が指定されていないので、シェルスクリプトの中で $1、$2 は空(から)です。
|(パイプ)、>(リダイレクト)を使うときは、標準入力、標準出力の概念を理解してください。
普通の実行方法では、標準入力はキーボード、標準出力は画面です。sample_shell.sh だけを実行すると、入力待ちになり、キーボードから打ち込んでエンターを押すと画面に出力されます。Ctrl+d で入力終了です。
標準入力、標準出力は、入力・出力先を実行時に切り替えられるすばらしいアイデアです。|(パイプ)は前のコマンドの標準出力を後ろのコマンドの標準入力に送る実行方法です。>(出力リダイレクト)は標準出力をファイルに保存します。ついでに、<(入力リダイレクト)はファイルの内容を標準入力へ入力します。
シャイン (30) 2009年4月17日21:50
|
|
|
|
[114302] |
素人である私にとって大変理解しやすい説明でした。ありがとうございました。プログラム内容も理解することができ、次へ活かせる勉強となりました。お世話になりました。
shell (未登録) 2009年4月19日12:23
|
|
|
|
( 参照数:13169 日平均:2.4 ) |
|
〜 回答の受付を終了しました 〜 |