我有一个要求。
我接受使用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'
我该怎么做?
答案 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 [*]}给出了保存的元素数量。