0

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

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

但与

myStr="hello world"
myFunc myStr

我没有输出。

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

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 中的字符串拆分为单词,该分隔符是单个空格。

谢谢!

4

3 回答 3

3

你不会“没有输出”——你会得到你传递的字符串的第一个单词:

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

如果你传递一个变量,你必须在你的函数中间接扩展变量

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

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

firstword() { set -- ${!1}; echo $1; }
firstword myStr
hello
于 2013-10-15T17:10:08.497 回答
1

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

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

你的功能将是:

function myFunc { echo "${1%% *}"; }
于 2013-10-15T17:07:19.627 回答
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
于 2013-10-15T17:27:54.313 回答