我很难理解这一点。我已经研究了大括号扩展和mv
命令,但由于某种原因它对我来说仍然没有意义。我正在阅读Unix和Linux系统管理手册,他们以此为例,但我不理解这一行:
mv $fname ${fname/.log/.LOG};
我意识到它正在移动当前$fname
变量,这与.log有关,但${fname/.log/.LOG};
令我感到困惑。我以为它基本上是mv
源目的地...那么为什么有2 /?如果有人能用简单的英语向我解释这一点,我将非常感激!
#!/bin/bash
find . -type f -name '*.log' | grep -v .do-not-touch | while read fname;
do
mv $fname ${fname/.log/.LOG/};
done
答案 0 :(得分:3)
mv
行应解释为“将$fname
移至${fname/.log/.LOG}
”。 ${var/pattern/string}
构造是参数扩展的一种形式,称为模式替换。它返回变量的值,第一次出现的模式被字符串替换。换句话说,在这种情况下,它会将.log
替换为.LOG
。因此,对于每个文件,该行类似于
mv file.log file.LOG
答案 1 :(得分:1)
正如您所说,$ fname包含以“.log”结尾的原始文件名。你看到的bash表达式是:获取变量$ fname的内容,找到“.log”并将其替换为“.LOG”。生成的行将以“.log”结尾的文件移动到具有相同名称的文件,但将“.log”替换为“.LOG”。
您可能需要查看http://tldp.org/LDP/abs/html/或http://www.tldp.org/LDP/abs/abs-guide.pdf以获取高级bash脚本编制指南。