我有一个像这样的变量(Tab分离):
“a b c d”
我想逐个读取字段,但问题是字段数不固定,我的意思是变量可能不包含字段或3个字段或100个字段或更多字段。
我不知道我能处理它的最好方法。 任何人都可以向我展示一个好方法吗?
答案 0 :(得分:3)
这是我到目前为止所发现的:
$ x=$'a a\t*\t c\td\te'
$x
是我的测试变量,包含制表符分隔的字段。
$ IFS=$'\t'
单词仅由制表符分隔,而不是空格或换行符。
$ set -f
禁用通配。
$ for i in $x; do echo "$i"; done
a a
*
c
d
e
使用$x
中的每个元素循环遍历$i
中的字词。
答案 1 :(得分:2)
使用read
命令。
IFS=$'\t' read -a fields <<< $'a b\tc d\te f'
for f in "${fields[@]}"; do
echo "$f"
done
输出
a b
c d
e f
答案 2 :(得分:1)
像这样使用cut -f#
:
$ cat string
a b c d
$ cut -f1 string
a
$ cut -f2 string
b
$ cut -f3 string
c
$ cut -f4 string
d
...或在shell脚本中......
$ cat test.sh
#!/bin/sh
var="a b c d"
echo $var | cut -d' ' -f1
echo $var | cut -d' ' -f2
echo $var | cut -d' ' -f3
echo $var | cut -d' ' -f4
$ ./test.sh
a
b
c
d
...或者......或者......
$ cat test2.sh
#!/bin/sh
var="a b c d"
SAVEIFS=$IFS
IFS=$(echo -en "\t")
for v in $var
do
echo $v
done
IFS=$SAVEIFS
$ ./test2.sh
a
b
c
d
答案 3 :(得分:1)
假设您的变量Z包含“a b c d”。您可以创建一个数组变量,从Z中拆分,如下所示:
ZA=( $Z )
然后可以${ZA[0]}
,${ZA[1]}
等方式访问各个元素。
然后,您可以对变量的每个部分执行一些操作:
for part in ${ZB[@]}; do
echo $part # or whatever you want to do with it
done
这是一种稍微更结构化的方法,因为您可以在for
语句中更直接地利用单词拆分:
for part in $Z; do
echo $part # or whatever you want to do with it
done
单词分裂是在遇到shell变量IFS中的字符时完成的。如果需要,您可以更改字符。
请注意,这种拆分方法是在shell内部完成的,因此它比产生awk
或外部cut
程序快得多,但它在shell中的可移植性也较差。
答案 4 :(得分:0)
echo $variable|awk '{print $1}' #will print the first field
echo $variable|awk '{print $2}' #will print the second field
echo $variable|awk '{print $NF}' #will print the last field
echo $variable|awk '{print NF}' #will print the number of fields
测试如下:
> setenv var "a b c d"
> echo $var|awk '{print $1}'
a
> echo $var | awk '{print $2}'
b
> echo $var | awk '{print $NF}'
d
> echo $var | awk '{print NF}'
4
>