如何将字符串转换为bash函数中的数组

时间:2013-10-15 17:05:28

标签: bash

我正在尝试在bash中编写一个函数,该函数采用空格分隔的字符串并输出该字符串中的第一个单词。我试过了

function myFunc { a=$1; b=($a); echo ${b[0]};}

但是

myStr="hello world"
myFunc myStr

我没有输出。

如果我在上面的函数定义中使用=" hello world"替换= $ 1,那么我会在应用时获得预期的结果

myFunc

结果:你好

此外,如果不是将myStr作为参数传递,而是传入" hello world"直接,它也有效:

myFunc "hello world"

结果:你好

我用感叹号以及expr构造尝试了各种各样的间接但是无济于事。最后,以下似乎有效:

function el_index { alias a=$1; b=($a); echo ${b[2]};}

我想在此聚集所有其他可能的方法来完成与上述相同的事情。特别是,有没有办法完全绕过中间变量a,并在上面的函数体中的第二个语句中执行类似b =($ {$ a})的操作?顺便说一下,施工

b=($a)

使用默认分隔符将存储在a中的字符串拆分为单词空格。

谢谢!

3 个答案:

答案 0 :(得分:3)

你没有“没有输出” - 你确实得到了你传递的字符串的第一个字:

function myFunc { a=$1; b=($a); echo ${b[0]}; }
myStr="hello world"
myFunc myStr
myStr

如果您传递变量 name ,则必须间接扩展函数中的变量

function myFunc { a=${!1}; b=($a); echo ${b[0]}; }
# ..................^^^^^
myFunc myStr
hello

这是另一种技术:它将变量名称作为第一个参数,然后用变量的中的单词覆盖位置参数。第一个单词是第一个位置参数

firstword() { set -- ${!1}; echo $1; }
firstword myStr
hello

答案 1 :(得分:1)

你可以这样得到第一个词:

myStr="hello world"
echo "${myStr%% *}"
hello

你的功能将是:

function myFunc { echo "${1%% *}"; }

答案 2 :(得分:0)

如果我理解正确,这似乎相当简单。我也认为你的方法有效。

    function myFunc1 { 
    a="${1}"; b=( $a ); echo ${b[0]};
    }

    function myFunc2 { 
    echo "${1}" | awk '{ print $1 }'
    }

    function myFunc3 { 
    echo "${1%% *}"
    }

    myFunc1 "Hello World"
    # Which prints out: Hello

    myFunc2 "Hello World"
    # Which prints out: Hello

    myFunc3 "Hello World"
    # Which prints out: Hello

输出:

    ./test.sh
    Hello
    Hello
    Hello