在UNIX中读取传递给用户变量的参数的计数

时间:2010-11-25 10:29:49

标签: shell unix ksh

我有一个要求。

我接受使用UNIX(ksh)脚本的变量中的USER输入。

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 个答案:

答案 0 :(得分:2)

ksh中不使用任何外部工具:

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

作为奖励,您的文件规范现在位于数组中:

$ echo ${a[1]}
po_line*.dat

答案 1 :(得分:0)

单步:

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

已编辑 - 已删除$ NF - > NF

答案 2 :(得分:0)

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 ";" " "

答案 3 :(得分:0)

IFS=\; read -A a <<< "$file_name"; print ${#a[*]}

这将$ file_name的内容作为标准输入发送到read命令,IFS设置为;对于读取(并且只读取,因此不需要保存/重置它)。 -A告诉read在IFS上拆分输入并保存命名数组中的每个单词(a)。 $ {#a [*]}给出了保存的元素数量。