2017-02-13 10 views
2

ファイルの名前を変更する際に変数を使用しようとしています。しかし、私は、ファイル名の先頭に変数を挿入すると、物事は期待どおりに動作しません。ここでBash:変数が正しく展開されない

はケースだ、私は、ファイル名のテストを持っている:

$ ls 
test 

と変数 i=1

ファイル名の末尾または途中に変数を追加する場合、それは動作します:

$ mv test test_$i 
$ ls 
test_1 

変数をファイル名の先頭に追加すると機能しません。

$mv test_1 test 
$mv test $i_test 
mv: missing destination file operand after 'test' 
Try 'mv --help' for more information. 

さらに悪いことに、ファイル名に拡張子がある場合、ファイルは削除されます。

$ touch test.try 
$ ls 
test.try 
$ mv test.try $i_test.try 
$ ls 
(nothing!) 

誰でもこれを私に説明できますか?それは私が知らないバグか何かですか?

mv test.try ${i}_test.try 

かは、二重引用符を使用し、提供します:

+0

、必ず変数を引用します。 'mv test" $ i "_test'を試してみてください – VM17

+1

見つからなかったファイルは' .try'に名前が変更されました。まだそこにあります( 'ls -a'を使って見てください)。 –

答えて

3

あなたはリテラルの残りの部分から、それを明確にするために、変数名の周り{}を配置する必要があります(覚えて、_は識別子で有効な文字です)あなたの単語の分割に対する保護とグロブ:あなたのコードで

mv test.try "${i}"_test.try 

$i_test  => shell treats "i_test" as the variable name 
$i_test.try => shell treats "i_test" as the variable name ('.' is not a valid character in an identifier) 

mv test.try $i_test.try => test.try got moved to .try as "$i_test" expanded to nothing. That is why ls didn't find that file. Use 'ls -a' to see it. 

は、この関連記事を参照してください:When do we need curly braces in variables using Bash?

関連する問題