bashのスクリプトで質問です。
hoge_command 何らかのコマンド
bashtest.sh bashスクリプト
とあるときに、
hoge_command | bashtest.sh
のようにパイプでの入力をスクリプト内で受け取る方法はありますか?
たとえばperlであれば、
while(<STDIN>){
....
のようにして受け取ることができると思いますが、
bashでは、どのようにすればよいでしょう。
また、bashtest.sh で、引数無しのときにUsageを出すようにしてあった場合にうまく動作しないので、
hoge_command | bashtest.sh -
のように記述して受け取る方法はあるでしょうか?
(同じくperlなら、
if( $ARGV[0] eq "-" ){
while(<STDIN>){
....
のように書いて逃げるところと思います。
初歩的なことで恐縮ですが、よろしくお願いします。
No.3ベストアンサー
- 回答日時:
#2です。
下記の方が良いと思います。
bashtest.sh abc - def ghi
のような途中に - があるケースにも対応できる。
for arg
do
case "$arg" in
-)
while read a; do
commandx "$a"
done
;;
*)
commandx "$arg"
;;
esac
done
この回答への補足
notnotさん、何度もありがとうございます。
for argで回す方法について理解しました。
もともとやりたかったことに対して、正確には次のようにしたかったのですが、
%bashtest.sh a b c
とやっても、
%echo a b c | bashtest.c -
とやっても、
(あるいは、%echo c | bashtest.sh a b - とやっても?)
bashtest.shの中では、
commandx a b c
のように呼び出すようにさせる。
この場合、次のような方法でよいでしょうか。
他に良い方法があれば、あらためて教えてください。
c=""
for arg
do
case "$arg" in
-)
while read a; do
c="$c $a"
done
;;
*)
c="$c $arg"
;;
esac
done
commandx "$c"
No.4
- 回答日時:
>この場合、次のような方法でよいでしょうか。
>他に良い方法があれば、あらためて教えてください。
これでよいと思います。
あと、commandx a b c と commandx "a b c" とはcommandxの動作は同じですか?もし違うなら、最後の commandx "$c" は、 commandx $c と " " をつけないのが正解です。引数の個数が3個か、1個かの違いがあります。
notnotさん、何度もご回答ありがとうございました。
>もし違うなら、最後の commandx "$c" は、 commandx $c と " " をつけないのが正解です。
>引数の個数が3個か、1個かの違いがあります。
あ、なるほど! 大変勉強になりました。
これで一通りのことがすっきり出来ました。
ありがとうございました。
No.2
- 回答日時:
・引数なしなら usage を出す
・引数があれば入力ファイルと見なしてそのファイルから読む
・引数が - なら標準入力から読む
だとすると、cat の機能を使って、
if test "$*" = ""
then echo Usage: aaaaaa bbbbb cccc
exit 0
fi
cat "$@" |
while read a
do 読んだデータ "$a" を使う処理
done
ご丁寧なご回答ありがとうございました。
私の質問が曖昧だったようで、すみません。
引数やパイプで受け取るのはファイル名ではなく文字列そのものとしたかったのです。
教えていただいた方法とミックスして、結果的には次のように書きました。
if test $# -eq 0
then
echo "Usage: $0 {strings|-}"
exit
fi
case "$1" in
-)
while read a; do
commandx "$a"
done
;;
*)
for a in "$@"; do
commandx "$a"
done
;;
esac
とりあえず、やりたかったことは出来るようになりました。
ありがとうございました。
No.1
- 回答日時:
bash自身の機能として、標準入力を取得するみたいな機能は、無かったはずです。
こういった場合、スクリプト内で、入力を最初に受け取るコマンドに対してリダイレクトするような意味合いの書き方になるはずです。
汎用的な書き方としては、readコマンドを使ったこんなやり方があります。
$ cat test2.sh
#!/bin/sh
while read line
do
echo $line
done
$ echo hogehoge | bash test2.sh
hogehoge
awkでもsedでも、入力を指定しなければ勝手に標準入力から取ろうとするので、何でもいけるはずですよ。
また、初期化処理の段階で引数処理も可能なので、引数にファイル名があったら、入力をそこからとり、無ければ標準入力を待ち受けるといった処理も可能でしょう。
引数無しで、Usageを出すということをしたかったため、複雑にしてしまいました。
while read の構文について、参考にさせて頂きました。
ご丁寧なご回答ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) awkのtoupper() 1 2022/10/21 20:39
- その他(プログラミング・Web制作) bashのgrepで複数の検索、かつスクリプト内で改行する方法を教えてください。 1 2022/10/06 20:09
- オープンソース php-Laravelのインストールについて 1 2022/08/13 01:08
- UNIX・Linux 実行の仕方及び実行結果が分かりません。 2 2022/11/17 19:31
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- PostgreSQL postgreSQLをbashで実行する際に「MORE」表示をなくす方法 1 2023/05/08 21:42
- UNIX・Linux デフォルト値のパラメータ展開 1 2022/08/12 17:34
- その他(開発・運用・管理) WindowsからSSHでサーバーにあるファイルをダウンロードできない…。 3 2022/04/24 11:08
- その他(プログラミング・Web制作) ログインシェル時のSHELL環境変数 1 2022/06/08 19:21
- PHP PHPを使って、別サイトの一部を取得して表示したいのです。。 1 2023/01/18 21:45
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
batである文字列内に特定の文字...
-
スクリプト中のexportコマンド...
-
kshでのNULLの比較
-
シェルスクリプトの変数の制限?
-
Bシェル 文字列に含まれる特...
-
if文について
-
bashスクリプト
-
Cシェルで標準エラー出力への...
-
shellスクリプトから別のshell...
-
awk スクリプト内で、関数の出...
-
TOPコマンドで表示するCPU使用...
-
Dirコマンドでフォルダ内ファイ...
-
エクセルの表にヘンな枠が・・・
-
スクリプトのエラー「unexpecte...
-
pingは正常なのにtracerouteで...
-
テキストファイルから最終行の抽出
-
ラズパイで『’test.service’をs...
-
bashでシングルクォート内の変...
-
net use /d の強制実行
-
-bash: ftp: コマンドが見つか...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
batである文字列内に特定の文字...
-
スクリプト中のexportコマンド...
-
shellスクリプトから別のshell...
-
bashスクリプト
-
シェルスクリプトの変数の制限?
-
kshでのNULLの比較
-
【sh】tee コマンドの代替方法
-
ファイルから文字列を読み込む...
-
シェルで and/or の優先順位に...
-
if文について
-
Bシェル 文字列に含まれる特...
-
Cシェルで標準エラー出力への...
-
cshの条件式について教えてくだ...
-
【シェルスクリプト】whileルー...
-
Cシェルプログラムで、あるディ...
-
ログインシェル時のSHELL環境変数
-
rubyで、バッククォートの中に...
-
【シェルスクリプト】 ローカル...
-
sh スクリプト ipアドレス形式...
-
シェルスクリプトでうるう年判定
おすすめ情報