2017-02-13 97 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!) 

任何人都可以解釋這一點嗎?這是一個錯誤還是我不知道的東西?

+0

總是給你的變量。嘗試'mv test「$ i」_test' – VM17

+1

請注意,缺少的文件已被重命名爲'.try' - 它仍然存在(使用'ls -a'來查看它)。 –

回答

3

你需要把{}周圍的變量名,從字面的休息歧義它(記住,_是一個標識符中的有效字符):

mv test.try ${i}_test.try 

,或者用雙引號,這使你免受分詞和通配符:

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?