这是我们每周的练习,没有评分或等级(我们甚至没有得到答案!)
如果有人有时间帮助向我解释这项练习,我将非常感激,因为我正试图在周末完成这项工作,并且要到下周才能得到导师的帮助。我做了很多关于 bash 编程、正则表达式和 grep 的阅读和工作。但下面的代码让我感到困惑。
我什至想知道,说明是否不完整,或者我只是不明白?
具体来说,以下几点阻碍了我理解整个事情:
NAMES=`ls *.$1`
filed=$(file:$1).$2
练习 4.3
假设给你一个文本文件(称为 myfile),其中包含以下内容
#!/bin/bash
NAMES=`ls *.$1`
for file in $NAMES; do
filed=$(file%:$1).$2
mv file filed
done
执行以下命令 $ grep ' file ' myfile
$ grep 'file*' myfile
$ grep '^ *file*' myfile
$ grep 'file$' myfile
$ sed 's/ file* / script /g' myfile
$ sed ' /for/,/files/d' myfile
$ sed '/\$[A-Z]..[A-Z]*/d' myfile
然后解释输出或结果
答案1
NAMES=`ls *.$1`
这是一个任务。该变量$NAMES
被分配了一个值。该值被视为反引号中命令的输出(请参阅 中的命令替换man bash
)。$1
是一个特殊参数,它对应于脚本的第一个参数。因此,似乎脚本应该以扩展名作为参数运行(例如./script.sh txt
),ls
命令的输出将存储在变量中。
filed=$(file%:$1).$2
这实在是太奇怪了。事实上,您确定括号不是大括号吗?并且还应该有 a.
代替:
.
filed=${file%.$1}.$2
${var%pattern}
从变量末尾剪切模式。man bash
详细信息请参见参数扩展。因此,在这种情况下,它会删除点加上第一个参数给出的扩展名,并添加一个点和第二个参数。
顺便说一句,移动线可能应该是
mv $file $filed
否则就没有理由使用循环。