我有一个Shell脚本,用于重命名一个文件夹中的多个文件。它可以在rhel主机上运行,但在ubuntu14主机上会引发错误。
#!/usr/bin/env bash
SOME_NUMBER=1
rename _file_name.c _file_${SOME_NUMBER}.c path/of/file/*_file_name.c
我应该对代码进行哪些更改以使其在ubuntu14主机上工作?
EDIT-1:
为了在ubuntu机器上运行代码,我进行了以下更改,并且有效:
rename 's/\_file_name.c$/\_file_1.c/' path/of/file/*_file_name.c
但以下操作无效,并且出现以下错误消息:
rename 's/\_file_name.c$/\_file_${SOME_NUMBER}.c/' path/of/file/*_file_name.c
错误消息:
Global symbol "$SOME_NUMBER" requires explicit package name at (eval 1) line 1.
Global symbol "$SOME_NUMBER" requires explicit package name at (eval 1) line 1.
答案 0 :(得分:2)
单引号可防止参数扩展。由于Perl和Shell语法在这方面是相似的,因此文字字符串s/\_file_name.c$/\_file_${SOME_NUMBER}.c/
传递给Perl,在此试图扩展未定义的变量$SOME_NUMBER
。
使用双引号代替:
rename "s/\_file_name.c$/\_file_${SOME_NUMBER}.c/" path/of/file/*_file_name.c
请参见Difference between single and double quotes in Bash
请确保您的Shell脚本中的SOME_NUMBER
的值实际上只是一个数字,或者至少是在扩展时会产生有效Perl表达式的值。