在 Bash 脚本中,
我有一个字符串,其中包含几个由一个或多个空格分隔的单词。即:
Name Age Sex ID Address
如果我想查找任何一个单词,比如我想查找单词“Age”的索引,我该怎么做?
是否有任何命令可以直接返回我想要的单词的索引号?
谢谢。
答案1
Bash 执行单词拆分字符串本身——事实上,避免这种情况往往是一个问题,这也是引用如此重要的原因。在你的案例中很容易利用这一点:只需将字符串放入数组中而不引用它——bash 将使用分词来分隔各个元素。假设你的字符串存储在变量中$str
,
ar=($str) # no quotes!
将返回一个包含 5 个元素的数组。数组索引是单词索引(从 0 开始计数,就像在大多数脚本和编程语言中一样),例如“Age”使用以下方式访问
${ar[1]} # 0 => Name, 1 => Age, 2 => Sex, 3 => ID, 4 => Address
或者,如果您需要按内容查找元素索引,请循环遍历数组,即
function el_index {
cnt=0; for el in "${ar[@]}"; do
[[ $el == "$1" ]] && echo $cnt && break
((++cnt))
done
}
el_index "Age" # => 1
答案2
$ export FOO="Name Age Sex ID Address"
用 Age 替换 *Age - 这将删除“Age”之前的所有内容:
$ echo ${FOO/*Age/Age}
Age Sex ID Address
获取“年龄”之前的任意内容
$ echo ${FOO/Age*/}
Name
获取该字符串的长度(即“Age”的索引):
$ BEGIN=${FOO/Age*/}
$ echo ${#BEGIN}
7
答案3
这是一个 7 年前的问题,但有些人可能需要纯 bash 的答案。
STRING="Name Age Sex ID Address"
INDEXOF_AGE=${#${STRING/Age*/}}
echo $INDEXOF_AGE
答案4
笔记:假设这里的索引是指你想知道哪个单词它是(从 0 开始),而不是哪个特点在单词开头的字符串中。其他答案针对的是后者。
据我所知,没有,但你可以做一个。两个技巧:
- 使用天生的能力为了构造以通过空格分割未引用的输入。
- 处理找不到所需列的情况。在这种情况下,我选择将找到的索引发送给 stout,并让状态代码指示查找是否成功。还有其他可能性。
代码:
#!/bin/bash
find_index() {
local str=$1
local search=$2
let local n=0
local retval=1 # here, 1 is failure, 0 success
for col in $str; do # $str unquoted -> whitespace tokenization!
if [ $col = $search ]; then
echo $n
retval=0
break
else
((n++))
fi
done
return $retval
}
test="Name Age Sex ID Address"
idx=`find_index "$test" Age`
if [ $? -ne 0 ]; then
echo "Not found!"
else
echo "Found: $idx"
fi