如何知道字符串中是否只包含一个或多个单词?

时间:2017-02-18 19:44:37

标签: string bash

当我在字符串中获取数组的内容时,我有以下2个解决方案:

$ a=('one' 'two')
$ str1="${a[*]}" && str2="${a[@]}"

当然,我可以在代码上重用我的字符串 但我怎么知道我的变量只有一个或几个单词?

3 个答案:

答案 0 :(得分:2)

在这两种情况下,数组的内容都连接成一个字符串并分配给变量。唯一的区别是用于连接元素的内容。使用${a[*]}时,会使用IFS的第一个字符。使用${a[@]}时,始终使用单个空格。

$ a=(one two)
$ IFS="-"
$ str1="${a[*]}"
$ str2="${a[@]}"
$ echo "$str1"
one-two
$ echo "$str2"
one two

在不引用的情况下展开$str1$str2时,无论最初如何定义变量,结果字的数量完全取决于IFS的当前值。当然,"$str1""$str2"每个都会扩展为一个单词。

答案 1 :(得分:0)

要添加@chepner的好答案:${arr[*]}${arr[@]}之间的差异与$*$@之间的差异非常相似。您可能需要参阅此帖子,其中涉及$*$@

What's the difference between $@ and $* in UNIX?

根据经验,使用"$@""${arr[@]}"比使用不带引号或*对应物更好。

答案 2 :(得分:0)

"${a[*]}"一起扩展为一个字符串,每个条目"${a[@]}"扩展为一个字符串。

假设我们有一个程序printParameters,它为每个参数($1$2等等)打印字符串my ... parameter is ...

>_ a=('one' 'two')

>_ printParameters "${a[*]}"
my 1. parameter is one two

>_ printParameters "${a[@]}"
my 1. parameter is one
my 2. parameter is two

如果要手动展开数组,则会写入 ${a[*]}"one two"
${a[@]}"one" "two"

关于IFS等也存在差异(参见其他答案)。通常@是更好的选择,但* 方式更快 - 在必须处理大型数组且不需要单独的参数的情况下使用后者。

顺便说一下:脚本printParameters可以写成

#! /bin/bash
argIndex=0
for argValue in "$@"; do
    echo "my $((++i)). argument is $argValue"
done

通过尝试和错误了解有关扩展的更多信息非常有用。