【问题标题】:Linux sequence function isn't working properly in a bash scriptLinux 序列函数在 bash 脚本中无法正常工作
【发布时间】:2021-10-09 23:49:12
【问题描述】:

我正在学习 Linux 课程,在脚本课程中,讲师使用 ping-sweeping 功能作为示例。它旨在遍历网络上从 1 到 255 的潜在 IP,并返回回复的 IP。代码如下

#!/bin/bash

for ip in 'seq 1 254'; do
ping -c 1 $1.$ip | grep "64 bytes" | cut -d " " -f 4 | tr -d ":" &
done

这是在一个名为 ipsweep.sh 的文件中,然后我们调用它

./ipsweep.sh [first three tuples of IP]

当我运行脚本时,我得到了结果

ping: [myIP].seq: Name or service not known

所以我假设它不是将 seq 作为函数读取,而是简单地点击它并尝试将其按原样放入我的脚本中。显然,像 192.168.1.seq 这样的 IP 不存在,所以我们遇到了这个问题。

我不完全理解序列函数的语法,因为我是 Linux 和一般脚本的新手,但我尝试过使用

for ip in (seq 1 254); do

而是脚本无法识别括号。基本上我只需要知道如何让'seq 1 254'函数工作。非常感谢任何帮助!

【问题讨论】:

  • seq 不是 bash 本身的一部分,也不是 POSIX 标准化的,以提供可靠的保证,即它存在或具有任何特定行为,以便操作系统或发行版能够自称为 POSIX -合规。考虑改用 shell 的内置语法:for ((ip=1; ip<=254; ip++)); do
  • 但更重要的是,(您的代码使用的字符)不是"(ASCII 双引号字符,它是唯一一种 shell 语法可识别的字符)。投票接近错误。
  • @CharlesDuffy 听起来智能引号是一些奇怪的复制和粘贴错误,而不是在实际脚本中。

标签: bash seq


【解决方案1】:

要运行命令并返回其输出,请使用$()

for ip in $(seq 1 254); do
    # Note ASCII double quotes
    ping -c 1 "$1.$ip" | grep "64 bytes" | cut -d " " -f 4 | tr -d ":" &
done
wait # Wait for all the background processes started in the loop to exit.

或者如果你使用bash, 使用brace expansion 而不是运行外部程序:

for ip in {1..254}; do
    # ...
done

【讨论】:

  • 所以我想当我从我的虚拟机复制和粘贴时,它改变了使用的引号,因为我的代码包含了正确的引号。等待是否只是防止循环结束时发生任何错误?
  • @rugbyralph288 它暂停脚本,直到所有这些后台管道完成。
【解决方案2】:

正如 Shawn 提到的,$() 通常是扩展命令的首选方式。但是也可以使用重音(或有时称为“反引号”)。您的代码遇到的问题是它使用了错误的重音类型 - 尖音符 (´) 而不是坟墓 (`)

【讨论】:

    猜你喜欢
    • 2023-03-04
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2012-12-15
    相关资源
    最近更新 更多