我正在制作一个小脚本来获取$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的页面。