0
フォルダ内のすべての.txtファイルを検索し、ベース名を取得してからファイルを再配置するbashスクリプトを作成しようとしています。しかし、ファイル名と文字列を組み合わせようとするたびに、見つかった実際のファイルの代わりにforループから "* .txt"ワイルドカードが出力されるという問題があります。変数をエコーするだけで、期待されるファイル名が出力されます。BASH変数が文字列値と組み合わせて値を変更する
以下に簡略化したスクリプトとその出力を示しました。私はBASHの新人です。これは変数を扱う方法と関係があると思います。私は数時間の説明を探していましたが、実際には何も思い付いていません。連結したときに値が変化する理由を誰でも説明できますか?ここで
はサンプルコードです:ここで
TEMP_PATH=C/Test
for testFile in $TEMP_PATH/*.txt; do
testFileName=$(basename "$testFile")
echo $testFileName
echo "FileName:$testFileName"
done
それぞれからの出力例は、ここで
TestOne.txt
FileName:*.txt
をエコーされたディレクトリ内のファイルがあります。 TestingToo.shは上に示したスクリプトです
TestingToo.sh TestOne.txt
助けていただければ幸いです!ありがとうございました。
を試してみてください。記述された環境であなたのスクリプトを実行すると、 'TestOne.txt FileName:TestOne.txt'が期待通りに得られます – nsilent22
Hmm。私はちょうど私がここに書かれている通りにスクリプトをコピーしてみました。それでも、私にとっては同じ出力が得られます。 これは奇妙なことですが、Windowsシステムでこれを実行しているのかどうかは不思議です。私はgit bashとWindows 10の開発者bashを試してみました。どちらも同じ結果を生みます... – 99problemsMvcIsOne
C/Testの下にいくつかのtxtファイルがありますか?そうでない場合、$ TEMP_PATH/*。txt **という文字列はC/Testの下のファイルのリストに展開されません。これは "そのまま"となりますので、変数 'testFile'を' C/Test/*。txt'に設定することになります。次のコマンドは 'testFileName'を' * .txt'に設定します。次に最初のechoコマンドで、bashは '* .txt'を現在のディレクトリの' TestOne.txt'にマッチするファイルのセットに置き換えます。しかし、2番目のエコーコマンドでは 'FileName:*。txt'パターンと一致するファイルはありません。だから、bashはそれをそのまま残します。 – nsilent22