оч разделенный вопрос

Я написал небольшой скрипт, используя команду awk «split», чтобы получить имя текущего каталога.

эхо $PWD

Мне нужно заменить «8» на количество токенов в результате операции разделения. // Если PWD = /home/username/bin. Я пытаюсь получить «bin» в package.

package="`echo $PWD | awk '{split($0,a,"/"); print a[8] }'`" 
echo $package 

Не могли бы вы сказать мне, что мне заменить вместо «print a [8]», чтобы скрипт работал для любого пути к каталогу?

-Сачин


person Sachin Shetye    schedule 22.01.2011    source источник


Ответы (3)


Вам не нужен awk для этого. Если вам всегда нужен последний каталог в пути, просто выполните:

#!/bin/sh

cur_dir="${PWD##*/}/"
echo "$cur_dir"

Вышеупомянутое имеет дополнительное преимущество, заключающееся в том, что не создаются подоболочки и/или ответвления для внешних двоичных файлов. Это все родной синтаксис оболочки POSIX.

person SiegeX    schedule 22.01.2011
comment
попробуй: $ cd /; echo ${PWD##*/} - person Tomasz Elendt; 23.01.2011
comment
@Tomasz достаточно честно. Простое добавление '/' должно прояснить это. - person SiegeX; 23.01.2011
comment
@dmckee: это было не предложение другого возможного решения, а вариант использования, в котором решение SegeX не сработает; С другой стороны, ваше решение напечатает имя родительского каталога $PWD и завершится ошибкой, если имя каталога содержит пробелы. - person Tomasz Elendt; 23.01.2011
comment
@dmckee Вы только что разветвили 3 процесса, чтобы выполнить то же самое, что оболочка может сделать изначально. На самом деле, Томаш прав, это не одно и то же, хотя basename "$PWD" да. Все-таки лишняя вилка. - person SiegeX; 23.01.2011

Вы можете использовать print a[length(a)], но лучше избегать разделения и использовать разделитель настраиваемых полей и $NF:

echo $PWD | awk -F/ '{print $NF}'

Но в этом конкретном случае вам лучше использовать basename:

basename "$PWD"
person Tomasz Elendt    schedule 22.01.2011

Другие ответы - лучшая замена для выполнения функции, которую вы пытаетесь выполнить. Однако вот конкретный ответ на ваш вопрос:

package=$(echo $PWD | awk '{n = split($0,a,"/"); print a[n] }')
echo "$package"

split() возвращает количество результирующих элементов.

person Dennis Williamson    schedule 23.01.2011