Считать количество параметров, переданных пользовательской переменной в UNIX - PullRequest
0 голосов
/ 25 ноября 2010

У меня есть требование.

Я принимаю ввод USER в переменную, используя скрипт UNIX (ksh).

file_name='po_header*.dat ; po_line*.dat ; po_dist*.dat'

Когда я повторяю,

echo "Data File Names : " $file_name

Я получу весь файлимена доступны на месте.Вывод будет выглядеть следующим образом:

po_headers_057.dat
po_headers_123.dat
po_headers_890.dat
po_lines_057.dat
po_lines_123.dat
po_lines_890.dat
po_distribution_057.dat
po_distribution_123.dat
po_distribution_890.dat

Мне нужно получить количество имен файлов, переданных в переменную, разделенных символом ';'.Вот в этом случае 3 .то есть 'po_header * .dat;po_line * .dat;po_dist * .dat '

Как мне это сделать?

Ответы [ 4 ]

2 голосов
/ 26 ноября 2010

В ksh без использования каких-либо внешних утилит:

saveIFS=$IFS; IFS=';'; a=($file_name); IFS=$saveIFS; echo ${#a[@]}

В качестве бонуса ваши спецификации файлов теперь находятся в массиве:

$ echo ${a[1]}
po_line*.dat
0 голосов
/ 27 ноября 2010
IFS=\; read -A a <<< "$file_name"; print ${#a[*]}

Это отправляет содержимое $ file_name в команду чтения в качестве стандартного ввода с IFS, установленным в; для чтения (и только для чтения, поэтому нет необходимости сохранять / сбрасывать его). -A говорит read, чтобы разделить ввод на IFS и сохранить каждое слово в именованном массиве (a). $ {# a [*]} дает количество сохраненных элементов.

0 голосов
/ 25 ноября 2010
count=`echo "po_header*.dat ; po_line*.dat ; po_dist*.dat" | \
sed 's/;//g' |wc -w|awk '{print $1;}'`
echo $count

работает для po_header*.dat ; po_line*.dat ; po_dist*.dat, для po_header*.dat ;; po_line*.dat ; po_dist*.dat; и для "po_header [0-9] .dat; po_line * .dat; po_dist * .dat".

Альтернатива sed должен использовать tr ";" " ".

0 голосов
/ 25 ноября 2010

в одну сторону:

count=$(echo "$file_name" | awk -F';' '{print NF}')
echo $count

Отредактировано - удалено $ NF -> NF

...