双引号bash脚本Linux

时间:2019-03-19 19:50:49

标签: linux bash shell

我不明白为什么输出是用户名,因为在第3行和第4行中必须打印/usr/bin/whoami。 请对我来说简单的移植

#!/bin/bash

WHEREWHOAMI="`which whoami`"
ROOTORNOT="`$WHEREWHOAMI`"
echo "$ROOTORNOT"

2 个答案:

答案 0 :(得分:1)

变量ROOTORNOT设置为WHEREWHOAMI执行的输出,而该输出又是命令which whoami的输出。

WHEREWHOAMI=`which whoami`  # <- /usr/bin/whoami
ROOTWHOAMI="`$WHEREWHOAMI`" # <- `/usr/bin/whoami`  # <- username

如果将set -x标志添加到脚本中,则可以轻松找出正在发生的情况。示例:

$ set -x
$ WHEREWHOAMI="`which whoami`"
++ alias
++ declare -f
++ /usr/bin/which --tty-only --read-alias --read-functions --show-tilde --show-dot whoami
+ WHEREWHOAMI=/usr/bin/whoami
$ ROOTORNOT="`$WHEREWHOAMI`"
++ /usr/bin/whoami
+ ROOTORNOT=kvantour
$ echo "$ROOTORNOT"
+ echo kvantour
kvantour
$ 

答案 1 :(得分:1)

即使在双引号内也对反引号进行评估。
(建议-不要使用反引号。请使用$()。)

WHEREWHOAMI="`which whoami`"

这将执行which whoami并将/usr/bin/whoami分配给WHEREWHOAMI

ROOTORNOT="`$WHEREWHOAMI`"

这会在反引号中执行/usr/bin/whoami,并将USERNAME结果分配给ROOTORNOT

它正在做应该做的事。
那不是你想要的吗?

也许您想要的是-

$: [[ $( $(which whoami) ) == root ]] && echo ROOT || echo not-root
not-root

尽管我确实建议存储值并进行比较。 你有不能仅仅使用

的原因吗?
if [[ root == "$LOGNAME" ]] 
then : ...