問題タブ [ifs]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
bash - bashでスペースを含むファイルを適切に処理して印刷する方法
私は単純な再帰的な ls プログラムを bash で書いています (これはあまり経験がないので、遠慮なく残忍にしてください)。
このプログラムは、各ファイル (場合によってはディレクトリ) を別々の行に出力することになっています。新しいディレクトリが入力されるたびに、出力が 4 つのスペース分シフトされ、ツリーのような出力が得られます。
現在、スペースを含むファイルを正しく出力せず、ディレクトリの後にスラッシュを付けません。(詳細は以下をご覧ください。)
コード
出力
スクリプトは、 というフォルダに含まれていますbash-practice
。するとrecls .
、次の出力が得られます。
問題
ご覧のとおり、インデントは適切に機能していますが、2 つの問題があります。
1) スペースが含まれているため、ファイルsample document.txt
が 2 行にまたがっています。
2)すべてのディレクトリの前にスラッシュが必要ですが、何らかの理由で最初のディレクトリでしか機能しません。
試みられた解決策
(1) を修正するために、内部ファイル区切り文字を保存して、次のように改行文字に置き換えてみました。
しかし、これはまったく機能しませんでした。最初のフォルダー以上は表示されませんでした。明らかに私の物事の理解は正しくありません。
(2) については、意図したとおりに動作しない理由がわかりません。
結論
bash は、他のほとんどのプログラミング言語 (シェル スクリプト言語) よりも珍しい構文を持っているように思われるため、私にとっては難しいので、私の過ちと解決策についての洞察をいただければ幸いです。
更新 #1
mklement0 が提案したサイトhttp://www.shellcheck.comに行きましたが、そのヒントは基本的にすべて二重引用符でした。を二重引用符で囲む"$@"
と、プログラムはファイルを正しく出力しましたsample document.txt
が、その直後に " binary operator expected
" エラーが発生しました。以下は、現在の外観を印刷したものです。
更新 #2 [問題は解決しましたか?]
myls_internal
OK、タイプミスがあったため、再帰時に呼び出された関数の以前のバージョンにデフォルト設定されていたことが判明しました。この以前のバージョンでは、ディレクトリをスラッシュでマークしていませんでした。「更新」セクションのエラー メッセージも修正されました。ラインを変えました
myls_internal "$file/*"
に
recls_internal $file/*
そして今、それは正しく動作しているようです。誰かが回答を書いている途中である場合でも、「$ @」を引用してスペースの問題を修正する方法の仕組みがよくわからないので、あなたの洞察に感謝します。
固定コード:
固定出力:
アップデート #3
この線
recls_internal $file/*
代わりに
recls_internal "$file"/*
スペースを含むディレクトリを正しく処理します。cs 350
それ以外の場合は、含むHomework1.pdf
などのフォルダHomework2.pdf
に展開されます
cs 350/Homework1.pdf 350/Homework2.pdf
いつあるべきか
cs 350/Homework1.pdf cs 350/Homework2.pdf
おもう?何が起こっているのかの詳細はわかりませんが、それで修正されたようです。
shell - IFS=$'\n' は「n」を削除しました
「IFS=$'\n' に問題があります。
スクリプトを実行すると:
「ン」が削除されます。ファイルを1行ずつ表示したい
file - ファイルへの出力の書き込みに関する問題
形式の小さなcsvファイルを読み込んでいますsize,name
.1行に1セットです。私のテスト ファイルでは、csv ファイルに 2 行あります。
コードを使用する場合
name
各行の値が端末に出力されます。
コードを使用する場合
次に、最後のものだけがファイルname
に出力されtemp2.txt
ます。
私は何を間違っていますか?!
arrays - \| を使用して bash スクリプトで配列を結合します。区切りとして
bash スクリプトに PID の配列があります。これらを \| で結合したい grep を使用して、配列内のいずれかの PID に一致するものを検索できるようにセパレーターとして。基本的に、以下に示すように IFS を変更しようとしていますが、発生する問題は、目的の出力ではなく、
私は得る
これは私が使用しているコードです
さまざまな方法で入力を変更しようとしましたが、何も機能しません。これに対するIFSのアプローチは不可能ですか?
bash - IFS が新しい行で停止しないようにする
単一の delimiter を使用して配列に変換したい複数行の文字列があり|
ます。ただし、設定IFS=|
すると、新しい行が表示される直前に停止します。
残りの行が評価されない理由と、それを防ぐ方法、新しい行の存在に関係なくすべての変数を割り当てることができるのは不思議です。
bash - read と IFS を使用した Bash while ループ
次の形式でファイルを解析する必要があります。
そして、現在の行からすべてのパラメーターを抽出して、行ごとに処理します。現在、私はそのような方法でそれを管理しています:
一時ファイルの作成を回避するにはどうすればよいですか?
残念ながら、これは正しく動作しません:
行全体がparam1に割り当てられているため。