如何获取字符串的第一个元素,用空格分隔

use*_*035 2 bash

我试图su在bash脚本中获取用户名。我使用以下代码:

user=`who am i`
#user <- "user4035     pts/0        2017-04-02 05:13 (my-hostname)"
userarray=($user)
#userarray <- ["user4035", "pts/0", "2017-04-02 05:13", "(my-hostname)"]
user=${userarray[0]}
#outputs "user4035"
echo $user
Run Code Online (Sandbox Code Playgroud)

它可以正常工作,但是用更少的命令就能达到相同的结果吗?

Tom*_*mas 11

另一个简单的解决方案是cut使用自定义分隔符:

user=$(who am I | cut -d ' ' -f1)
echo $user
Run Code Online (Sandbox Code Playgroud)


Aln*_*tak 7

您可以通过在一行上创建数组来删除一行命令,但不值得做更多的事情,因为至少您只使用 shell 内置命令,而不派生任何其他命令:

who=(`who am i`)
user=${who[0]}
Run Code Online (Sandbox Code Playgroud)


Ini*_*ian 5

使用bash 参数扩展而不需要使用数组,

myUser=$(who am i)
printf "%s\n" "${myUser%% *}"
user4035
Run Code Online (Sandbox Code Playgroud)

(或)只使用一个简单的awk命令,

who am i | awk '{print $1}'
user4035
Run Code Online (Sandbox Code Playgroud)

即在变量中,

myUser=$(who am i | awk '{print $1}')
printf "%s\n" "$myUser"
Run Code Online (Sandbox Code Playgroud)

(或)如果您的脚本带有sudo特权运行,则可以使用此bash环境变量,

printf "%s\n" "${SUDO_USER}"
Run Code Online (Sandbox Code Playgroud)

  • 罗夫。这里典型的是“bash”社区。_使用 `{...}` 而不是 `(....)` 因为后者 fork 了一个子 shell..._ 或 _使用参数扩展因为 fork/exec 效率低下..._ 等等...当然,如果有人会在循环中使用 zilion 次 `$(echo $var | grep | sed)` 来解决可通过参数扩展解决的问题 - 会说好吧,但是 - 天哪 - 谁在乎这样的脚本?几毫秒 +- 没关系... (2认同)
  • 我以为这个问题被标记为 Bash。哦,等等,是的。 (2认同)