[解決済み] bash関数へのパイプ出力
質問
bashスクリプトに簡単な関数があり、入力としてstdoutをパイプしたいのですが、どうすればいいですか?
jc_hms(){
printf "$1"
}
このように使いたい。
var=`echo "teststring" | jc_hms`
もちろん、質問を単純化するために冗長な関数echoとprintfを使用しましたが、あなたはアイデアを得ることができます。 今現在、私は "not found" エラーを受け取りますが、これは私のパラメータの区切りが間違っている("$1"の部分)ことを意味していると思います。 何か提案はありますか?
元々jc_hms関数はこのように使用されていました。
echo `jc_hms "teststring"` > //dev/tts/0
というようなことを書いていますが、シリアルポートに送る前に、まず結果を変数に保存して、さらに処理したいと思います。
編集 私は、bash 関数に "|" パイプ文字でインターフェイスしたいのですが、これが可能かどうか疑問に思っているのです。
EDIT: さて、ここに完全な関数があります。
jc_hms(){
hr=$(($1 / 3600))
min=$(($1 / 60))
sec=$(($1 % 60))
printf "$hs:%02d:%02d" $min $sec
}
私は、このコードの行に来る文字列を形成するために関数を使用しています。
songplaytime=`echo $songtime | awk '{print S1 }'`
printstring="`jc_hms $songplaytime`" #store resulting string in printstring
ここで、$songtimeはスペースで区切られた"playtime totaltime"として表現される文字列です。
これを1行でやって、awkの後にパイプでつなげばいいのですが
printstring=`echo $songtime | awk '{print S1 }' | jc_hms`
というように
どのように解決するのですか?
実際の質問に答えると、シェル関数がパイプの受信側にいるとき、標準入力は、以下のように継承されます。 すべて コマンドに継承されますが、実際に標準入力を読み込むコマンドだけがデータを消費します。次々と実行されるコマンドの場合、後のコマンドは前のコマンドによって消費されなかったものだけを見ることができます。2 つのコマンドが並行して実行される場合、どのコマンドがどのデータを見るかは、OS がコマンドをどのようにスケジュールするかに依存します。
では
printf
が関数内の最初で唯一のコマンドであるため、標準入力は事実上無視されます。これを回避する方法はいくつかあり、例えば
read
に渡すことができる変数に標準入力を読み込むために、 printf
:
jc_hms () {
read foo
hr=$(($foo / 3600))
min=$(($foo / 60))
sec=$(($foo % 60))
printf "%d:%02d:%02d" "$hr" "$min" "$sec"
}
しかし、パイプラインの必要性は、あなたの認識する
awk
を使用する必要性に依存しているようなので、次の代替案を提案させてください。
printstring=$( jc_hms $songtime )
以降
songtime
はスペースで区切られた数字の組で構成されているので、 シェルは
songtime
の値に対して単語分割を行い
jc_hms
は2つの別々のパラメータを見ることになります。これには
jc_hms
の定義に変更はなく、標準入力から何かをパイプする必要もありません。
もし、まだ別の理由で
jc_hms
が標準入力を読み取るための別の理由がまだある場合は、私たちに教えてください。
関連
-
[解決済み] Bashスクリプトのソースディレクトリをスクリプト自体から取得するにはどうすればよいですか?
-
[解決済み] Bashシェルスクリプトでディレクトリが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashで通常のファイルが存在しないかどうかを判断する方法を教えてください。
-
[解決済み] Bashで文字列変数を連結する方法
-
[解決済み] Bashで文字列が部分文字列を含むかどうかをチェックする方法
-
[解決済み] Bash prints リテラルの改行をエコーする \n
-
[解決済み] Bashスクリプトからプログラムが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashでコマンドの出力に変数を設定するにはどうすればよいですか?
-
[解決済み] Unix/Linuxで、ファイルのあるフォルダを別のフォルダにコピーするにはどうしたらいいですか?[クローズド]
-
[解決済み】Bashでファイル名と拡張子を抽出する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Kali Linuxのマウスライトテーマを変更する方法は?マウスカーソルのテーマを変更するためのヒント
-
deepin20の不正確な時刻表示を調整する方法は?Deepinの時刻補正方法
-
Kali Linuxのマウスを左利き用に設定する方法は?Linuxマウス左利き操作選択方法
-
ディープインシステムの画面解像度を設定する方法は?ディープインシステムの解像度を設定する方法
-
deepin20のデスクトップアイコンのスタイルを変更する方法は?deepinのアイコンテーマを変更するためのヒント
-
Centos7 dns service named installation, encountered ** server can't find xxx.com: NXDOMAIN問題
-
Apache の一般的な設定エラー
-
[解決済み] エクスポートされた環境変数を削除する方法を教えてください。
-
[解決済み] ターミナルで現在の日付と時刻を取得し、それに対してターミナルでカスタムコマンドを設定するにはどうすればよいですか?[クローズド]です。
-
[解決済み] Bashを使って一行ずつ読み、スペースを確保する