我正在尝试在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中的字符串拆分为单词空格。
谢谢!
答案 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