bash 脚本中的回显$var "command not found"错误



我正在制作一个小脚本来获取$SSH_CLIENT的ip地址。

#!/bin/bash
set -euf -o pipefail
ip=${SSH_CLIENT%% *}
echo $ip

我一直得到一个错误的这两个方法:

ip=echo $SSH_CLIENT | awk '{ print $1}'
ip=echo $SSH_CONNECTION | awk '{print $1}'

错误:

$ ./ignoreip.sh
./ignoreip.sh: line 3: the.ip.address.of.ssh_client: command not found

→修改IP地址,原因很明显

但它适用于:

ip=${SSH_CLIENT%% *}

谁能给我解释一下为什么这两个命令不工作,但最后一个可以吗?

因为你的语法全错了。当有些地方不合理时,请务必在https://www.shellcheck.net/上尝试您的代码。

Line 3:
ip=echo $SSH_CLIENT
^-- SC2209 (warning): Use var=$(command) to assign output (or quote to assign string).

您正在做的是在命令期间将echo分配给ip(然后失败),然后尝试在$SSH_CLIENT中执行命令,这显然是the.ip.address.of.ssh_client,这不是一个有效的命令。

您可能想要的正是您在顶部发布的内容,但出于示例的目的…

ip=`echo "$SSH_CLIENT" | awk '{ print $1}'`    # old-style backticks
ip=$(echo "$SSH_CLIENT" | awk '{ print $1}')   # nestable bash subcall

有很多其他的可能性,但其中一个可能是你想要做的事情。但你最终得到的要好得多-

ip="${SSH_CLIENT% *}"

或者

ip="${SSH_CLIENT/ */}"

说真的,花点时间通读整个手册,特别是参数解析,并查看BashFAQ,特别是(对于这个示例)他关于子shell的页面。

相关内容

  • 没有找到相关文章

最新更新