我有一个像这样的变量(制表符分隔):
“A B C D”
我想逐个读取字段,但问题是字段数不固定,我的意思是变量可能不包含字段或 3 个字段或 100 个或更多字段。
我不知道我能处理它的最好方法。任何人都可以告诉我一个好方法吗?
这是我到目前为止发现的:
$ 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
用 in 中的每个元素循环遍历单词in $i
。
使用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
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
假设您有包含“abc d”的变量 Z。您可以创建一个从 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 中的字符,就会进行分词。您可以根据需要更改字符。
awk
请注意,这种拆分方法是在 shell 内部完成的,因此它比生成或外部程序要快得多cut
,但它在 shell 之间的可移植性也较差。
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
>