0

私はスクリプトの初心者で、次の問題があります。

fuserコマンドを使用して、その名前のファイルが存在するかどうかを確認したいと考えています。コマンドの出力を保存し、後でそれを使用して、ロードする前にファイルの名前を変更したいと考えています。

私は次のことを試しました:

#!/bin/bash
file_name='test'
echo 'file_name before: '$file_name
file_name=`fuser FILE_DIR/SD/Test_file_??????????????.dat`
echo 'file_name after: '$file_name'

ただし、上記のコードの結果は次のとおりです。

-bash-3.00$ script.sh
file_name before :test
FILE_DIR/SD/Test_file_20180823120345.dat
file_name after:

コマンドの出力が変数に保存されず、画面に表示され、その理由がわかりません!

私がやりたいことはTest_file_20180823120345.dat、変数に保存し、 file_nameそこからタイムスタンプを削除して、ファイルの名前をTest_file_20180823.dat.

次に、ステージング テーブルにデータを再度ロードした後、ファイルの名前を受け取った古いファイル名に変更し、ファイルを元の名前でアーカイブします。

4

1 に答える 1

1

あなたの問題は、次の閉じ一重引用符がありません。

echo 'file_name before: '$file_name

echo 'file_name after: '$file_name'(これが、スクリプトを実行するために最後の行の引用符のバランスを崩す必要があった理由でもあります)

代わりに、文字列全体を二重引用符で囲むだけechoで、 variable の展開が可能になりますfile_name

echo "file_name after: $file_name"

さらに、コマンド置換にバッククォートを使用しないでください。代わりに、次の$(...)ような形式を使用してください。

file_name=$(fuser FILE_DIR/SD/Test_file_??????????????.dat)

または、次のように書き直します。

#!/bin/bash

file_name='test'
echo "file_name before: $file_name"
file_name=$(fuser FILE_DIR/SD/Test_file_??????????????.dat)
echo "file_name after: $file_name"

(注:とのマッチングは、後に続く文字をfuser含むパターンにのみ一致します。これはあなたが望むものかもしれませんが、の可能性に応じて、おそらくよりクリーンな方法で書くことができます)14Test_file_.dat??????????????

はエラーを提供しますが、 の呼び出し後に が空かどうかをテストして、コマンド置換が変数を返したことを検証fuserする習慣を身につけたい場合もあります。file_namefuser

#!/bin/bash

file_name='test'
echo "file_name before: $file_name"
file_name=$(fuser FILE_DIR/SD/Test_file_??????????????.dat)
if [ -z "$file_name" ]; then
    echo "error: no file matched pattern" >&2
else
    echo "file_name after: $file_name"
fi

内容を確認して、さらに質問がある場合はお知らせください。

于 2018-08-24T04:23:53.473 に答える