2

xml ファイルの存在を確認する簡単なシェル スクリプトを作成し、存在する場合は、古い xml ファイルの名前を変更してバックアップし、新しい xml ファイルを古い xml ファイルが保存されていた場所に移動します。

#!/bin/sh    

oldFile="/Documents/sampleFolder/sampleFile.xml"
newFile="/Documents/sampleFile.xml"
backupFileName="/Documents/sampleFolder/sampleFile2.backup"
oldFileLocation="/Documents/sampleFolder"

if [ -f "$newFile" ] ; then
    echo "File found"
    #Rename old file
    mv $oldFile $backupFileName
    #move new file to old file's location
    mv $newFile $oldFileLocation
else
    echo "File not found, do nothing"
fi   

ただし、スクリプトを実行しようとするたびに、4 つのコマンドが見つからないというメッセージと構文エラー:予期しないファイルの終わりが表示されます。これらのコマンドが見つからないエラーまたは予期しないファイルの終わりが発生する理由について何か提案はありますか? すべての二重引用符を閉じていることを再確認しました。コードが強調表示されています:)

編集:実行中のスクリプトからの出力:

: command not found: 
: command not found: 
: command not found1: 
: command not found6: 
replaceXML.sh: line 26: syntax error: unexpected end of file
4

3 に答える 3

8

Cygwinで実行していると思います。エラー メッセージには、表示されているもの以外にも次のようなものがあります。

: command not found: 
: command not found: 
: command not found1: 
: command not found6: 
replaceXML.sh: line 26: syntax error: unexpected end of file

"\r\n"Windows エディタを使用してスクリプト ファイルを作成した可能性があります。つまり、Unix スタイルの LF ( ) 行末ではなく、Windows スタイルの CR-LF ( ) 行末を使用しています'\n'。Cygwin の一部のプログラムはどちらの形式も処理できますが、シェルは処理できません。

たとえば、次のような行

then

シェルには次のように見えます

then^M

ここで、^M は ASCII CR 文字です。存在する場合、これは実際には有効なコマンド名になりますが、存在しないため、シェルは文句を言います。

then^M: command not found

ただし、CR 文字を印刷すると、カーソルが行の先頭に戻るため、 の前のすべて:が上書きされます。

シェルが .fiに一致するif.

コマンドを使用してdos2unix、行末を修正できます。必ずマニュアル ページ ( man dos2unix) をお読みください。ほとんどのテキスト フィルターとは異なり、dos2unixstdout に書き込むのではなく、入力ファイルを置き換えます。

于 2012-10-05T21:35:19.630 に答える
0

古いシェルの合法的な場所にないことを除けば、コードに問題はありません。また、mv への引数を引用符で囲んでいることにも注意してください (ただし、ファイルの名前が適切であれば問題ありません)。

これを試して:

#!/bin/sh    

oldFile="/Documents/sampleFolder/sampleFile.xml"
newFile="/Documents/sampleFile.xml"
backupFileName="/Documents/sampleFolder/sampleFile2.backup"
oldFileLocation="/Documents/sampleFolder"

if [ -f "$newFile" ]
then
    echo "File found"
    mv "$oldFile" "$backupFileName"
    mv "$newFile" "$oldFileLocation"
else
    echo "File not found, do nothing"
fi  

PS: /bin/sh が bourne ベースのシェル (またはそれを指している) であることを確認してください。

于 2012-10-05T21:27:28.350 に答える