115:wc -l:find . -iname "*test*":find /tmp/ -iname "*test*"
我想解析上面的字符串。
就我而言,一个字符串由 4 列组成(每个命令都有:
分隔符),但它可以更长。我想“拉出”所有命令,包括初始编号,以 , 开头115
并继续wc -l, -iname "*test*"
,find /tmp/ -iname "*test*"
...始终不带:
分隔符。
我的变量$var
应该得到这些值:
var= 115 , var= wc-l , var= find . -iname "*test*" , var= find /tmp/ -iname "*test*"
我的代码:
while read line;
do
while [[ $var -ne '0' ]];
do
var=$( echo $line | cut -d ':' -f$i )
i=$( expr $i + 1 )
echo $var
done
done <$1
我从文件中读取行,并在将列剪切到空列时使用第二行。显然,有问题,因为 echo 没有打印任何内容。
答案1
这是您的脚本,已修复为按照我认为您的意思工作的方式工作:
i=1
while read line;
do
while :; do
var=$( echo $line | cut -d ':' -f$i )
i=$( expr $i + 1 )
[[ "$var" != "" ]] || break
echo $var
done
done <$1
几点说明:
i
没有初始化var
也没有初始化,所以内部循环甚至不会执行一次- 我不确定什么
[[ $var -ne '0' ]]
测试,但我认为$var
与空字符串相比更好。 - 因此,如果有一个空字段(即两个连续的冒号),该脚本将在那里终止
做同样事情的更可靠的方法是:
while read line; do
num_fields=$(echo $line|awk -F':' '{print NF}')
for (( i=1; i <= num_fields; i++ )); do
var=$( echo $line | cut -d ':' -f$i )
echo $var
done
done <$1