Shell重命名含下划线文件的异常行为及原因咨询
问题原因与解决办法
这个问题本质是Shell变量的解析规则在搞鬼!
咱们仔细看第二个命令里的关键部分:mv model_best model_$i_best。Shell在识别变量时,会把$i_best当成一个完整的变量名——因为Shell允许变量名包含字母、数字和下划线,它会自动匹配最长的合法变量名。而你只在循环里定义了i这个变量,i_best是未定义的空变量,所以展开后这条命令实际变成了:
mv model_best model_
自然就只会生成一个名为model_的文件了。
解决办法
用**大括号{}**把变量名包裹起来,明确告诉Shell变量的边界,避免它把后面的下划线和字符当成变量名的一部分:
for i in `seq 10`; do touch model_best; mv model_best model_${i}_best; done
这样Shell会准确解析${i}为循环变量i的值,再和后面的_best拼接,执行后就能正常生成model_1_best到model_10_best这10个文件啦。
内容的提问来源于stack exchange,提问作者jsjie
相关产品推荐
相关产品推荐

