2017-02-13 13 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?