Можно ли объяснить относительно того, как следующая часть кода работает?
l_Basename="hello_world.ksh"
l_THIS_FILE=`echo $l_Basename | awk -F. '{field=1
while (field < NF) {
printf $field
if (field < NF - 1) {
printf "."}
field++}
printf "\n"}'`
-F.
устанавливает Разделителя полей на .
: Учитывая строку a.b.c.
, awk будет видеть четыре поля: a
, b
, c
, и (пустое поле).
field=1
while (field < NF)
{
printf $field
if (field < NF - 1)
{
printf "."
}
field++
}
field
начинается 1, поскольку поле 0 является всей строкой (или запись, чтобы быть точным). Так как проверка < NF
, это никогда не достигает последнего поля..
, по-видимому, как разделитель полей для некоторой другой программы для обработки.Все сказали, что этот код является замысловатым способом реализовать basename
, команда часто раньше разделяла расширение от имени файла:
$ basename hello_world.ksh .ksh
hello_world
Даже в awk
, более краткий путь состоял бы в том, чтобы постепенно уменьшить количество полей одним: NF--
, и набор Выходной Разделитель полей к .
, так, чтобы это было автоматически добавлено между полями:
$ echo hello_world.ksh | awk -F. -v OFS=. '{NF--}1'
hello_world
"-F" опция позволяет изменять символ "разделителя полей" Awk. Awk расценивает каждую строку входных данных, как составлено из нескольких "полей", которые являются по существу словами, разделенными пробелами. Пробел (или символ табуляции) является "разделителем полей" по умолчанию. В некоторых случаях входные данные могут быть разделены на другой символ, например, a ": ", и было бы хорошо быть в состоянии сказать Awk использовать различного разделителя полей. Это - то, что"-F" опция делает. Вызвать Awk и определить a ":" как разделитель полей, мы пишем:
awk -F: ...
В этом случае, разделитель полей является a"."