Это для нашей еженедельной практики, без оценок и замечаний (мы даже не получаем ответы!)
Я был бы очень признателен, если бы кто-нибудь нашел время, чтобы помочь мне объяснить это упражнение, так как я пытаюсь сделать эту работу за выходные и не смогу получить помощь от своего репетитора до следующей недели. Я много читал и работал над программированием на 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
в противном случае не было бы смысла использовать цикл.