Bash 如何在子shell中使用grep命令?

Bash 如何在子shell中使用grep命令?,bash,ssh,grep,subshell,Bash,Ssh,Grep,Subshell,我想通过bashscript连接到4台服务器,并在每台服务器上执行一些命令。命令的输出应保存在本地变量中。所以我尝试了这种代码的和平 我已经试过几种方法了。当我只是执行一个“ls”或其他东西时,我得到了正确的结果。仅在使用zgrep/grep时,它不会像预期的那样工作。脚本在第四次回音后停止。看起来grep命令有问题,但我不知道是什么 for node in $(echo $nodes | sed "s/,/ /g") do echo "#########################

我想通过bashscript连接到4台服务器,并在每台服务器上执行一些命令。命令的输出应保存在本地变量中。所以我尝试了这种代码的和平

我已经试过几种方法了。当我只是执行一个“ls”或其他东西时,我得到了正确的结果。仅在使用zgrep/grep时,它不会像预期的那样工作。脚本在第四次回音后停止。看起来grep命令有问题,但我不知道是什么

for node in $(echo $nodes | sed "s/,/ /g")
do
    echo "############################"
    echo "Searching in Node: $node"
    echo "Searching in file(s) of pattern: $FILENAME"
    echo "Searching for string: $SEARCH_STRING"
    OUT=$(ssh -t -v $user@$node "cd $TESA_LOG_DIR; zgrep $SEARCH_STRING $FILENAME")
    echo $OUT
done

我们不知道这些变量设置为什么;但是传入一个空的搜索字符串或文件名会产生您描述的症状

事实上,正确地引用变量可以修复这个问题,并提高健壮性,尽管很明显,我们不知道是什么原因首先导致这些变量为空

此外,您应该避免使用大写变量名,因为它们是为系统使用而保留的

下面是一个重构,希望能帮助您找到根本原因并解决一些风格问题。我添加了一些内联注释

# This is still problematic.
# How is $nodes initialized?
# Maybe use an array instead
for node in $(echo "$nodes" | sed "s/,/ /g")
do
    # Massive verbosity removed
    # Avoid useless variable
    # Avoid cd
    ssh -t -v "$user@$node" zgrep "$SEARCH_STRING" "$TESA_LOG_DIR/$FILENAME"
done

我们不知道这些变量设置为什么;但是传入一个空的搜索字符串或文件名会产生您描述的症状

事实上,正确地引用变量可以修复这个问题,并提高健壮性,尽管很明显,我们不知道是什么原因首先导致这些变量为空

此外,您应该避免使用大写变量名,因为它们是为系统使用而保留的

下面是一个重构,希望能帮助您找到根本原因并解决一些风格问题。我添加了一些内联注释

# This is still problematic.
# How is $nodes initialized?
# Maybe use an array instead
for node in $(echo "$nodes" | sed "s/,/ /g")
do
    # Massive verbosity removed
    # Avoid useless variable
    # Avoid cd
    ssh -t -v "$user@$node" zgrep "$SEARCH_STRING" "$TESA_LOG_DIR/$FILENAME"
done

这些变量设置为什么?命令停止通常表示您正在传递一个空变量,并且没有正确引用它(这里有充分的证据)。不要对私有变量使用大写。在请求人工帮助之前请尝试(尽管没有任何错误会导致您请求帮助的症状)。这些变量设置为什么?命令停止通常表示您正在传递一个空变量,并且没有正确引用它(这里有充分的证据)。不要对私有变量使用大写。在请求人工帮助之前尝试一下(虽然没有任何错误会导致您请求帮助的症状)。
$(echo“$nodes”| sed“s/,//g”)
可以替换为
${nodes//,//}
是的,但正如我在评论中所说的,这可能需要完全重构。
$(echo“$nodes”| sed“s/,///g”)
可以替换为
${nodes//,/}
是的,但正如我在评论中所说的,这可能需要完全重构。