在bash中重复赋值

在bash中重复赋值,bash,Bash,我有一个bash脚本。它应该读取一个包含域列表的.txt文件。每次它将占用该.txt文件的一行,找到其ip地址并将其写入输出: while IFS= read -r line; do ipV= while IFS= read -r ip; do if [[ $ip =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then

我有一个bash脚本。它应该读取一个包含域列表的.txt文件。每次它将占用该.txt文件的一行,找到其ip地址并将其写入输出:

while IFS= read -r line; do
                ipV= 
                while IFS= read -r ip; do
                        if [[ $ip =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
                                ipV="${ip}-"
                        fi
                done < <(dig +short "$line")        
                ipV=${ipV%-}

done < URLs.txt
我的问题是,有时dig+short$行不会返回结果。在本例中,我希望重复该操作,直到它最终找到ip地址,直到ipV不为空。事实上,我想这样做:

while IFS= read -r line; do
                ipV= 
                while IFS= read -r ip; do
                        if [[ $ip =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
                                ipV="${ip}-"
                        fi
                done < <(dig +short "$line")        
                ipV=${ipV%-}
                if [ -z "$ipV" ] #if empty
                    #repeat the above steps
                else
                    echo "$ipV" >> out.csv
                fi

done < URLs.txt

但由于我是bash的新手,我不知道如何处理这个问题。如果ipV为空,我可以做些什么来重复给它赋值?

将代码包围在一个循环中,直到循环达到狭窄的请求:

ipV=
until [[ $ipV ]]; do
  while IFS= read -r ip; do
    [[ $ip =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]] && ipV+="${ip}-"
  done < <(dig +short "$line")        
done
我也会考虑:

set -o pipefail # make an entire pipeline fail if any part fails

while IFS= read -r line; do
  ipV=; retries=10
  until [[ $ipV ]] || (( retries <= 0 )); do
    ipV=$(dig +short "$line" | grep -E '^[0-9]+[.][0-9]+[.][0-9]+[.][0-9]+$' | tr '\n' '-')
    (( --retries ))
  done
  if [[ $ipV ]]; then
    echo "${ipV%-}"
  else
    echo "ERROR: Gave up retrieving IP for $line after 10 retries" >&2
  fi
done <URLs.txt >out.csv
塞德

更新@CharlesDuffy comment,我假设OP是自己创建这个url.txt的,不是吗?但让我们来测试一下

$ cat URLs.txt
stackoverflow.com
google.com
github.com
$( ls -la )
我会给我们这个

$ sed 's/\(.*\)/dig +short \1/e' URLs.txt
151.101.129.69
151.101.193.69
151.101.1.69
151.101.65.69
173.194.222.100
173.194.222.113
173.194.222.101
173.194.222.102
173.194.222.139
173.194.222.138
140.82.118.4
Invalid option: -rw-r--r--
Usage:  dig [@global-server] [domain] [q-type] [q-class] {q-opt}
            {global-d-opt} host [@local-server] {local-d-opt}
            [ host [@local-server] {local-d-opt} [...]]

Use "dig -h" (or "dig -h | more") for complete list of options
但这可能会产生一些坏的后果

$ cat URLs.txt 
stackoverflow.com
google.com
github.com
| ls -la

$ sed 's/\(.*\)/dig +short \1/e' URLs.txt
151.101.129.69
151.101.193.69
151.101.65.69
151.101.1.69
173.194.222.139
173.194.222.101
173.194.222.102
173.194.222.100
173.194.222.113
173.194.222.138
140.82.118.3
итого 68
drwxr-xr-x  2 ivan ivan  4096 фев 25 09:30 .
drwxr-xr-x 86 ivan ivan 12288 фев 25 08:44 ..
-rw-r--r--  1 ivan ivan  1003 фев 19 17:48 file
-rw-r--r--  1 ivan ivan   393 фев 17 14:45 file2
-rw-r--r--  1 ivan ivan    40 фев 21 09:48 headers
-rw-r--r--  1 ivan ivan    27 фев 21 11:19 id.txt
-rw-r--r--  1 ivan ivan    44 фев 20 11:37 input.txt
-rw-r--r--  1 ivan ivan   121 фев 21 12:16 lines
-rw-r--r--  1 ivan ivan   195 фев  7 17:21 lines.py
-rw-r--r--  1 ivan ivan   160 фев 21 11:53 out
-rw-r--r--  1 ivan ivan   210 фев  7 17:12 output
-rwxr-xr-x  1 ivan ivan   157 фев 21 17:46 test
-rw-r--r--  1 ivan ivan    21 фев 21 17:44 test2
-rw-r--r--  1 ivan ivan    22 фев 21 17:46 test3
-rw-r--r--  1 ivan ivan    49 фев 25 09:30 URLs.txt
及;也会受伤

$ cat URLs.txt 
stackoverflow.com
google.com
github.com
; ls -la

$ sed 's/\(.*\)/dig +short \1/e' URLs.txt
151.101.65.69
151.101.1.69
151.101.129.69
151.101.193.69
173.194.222.100
173.194.222.113
173.194.222.138
173.194.222.101
173.194.222.139
173.194.222.102
140.82.118.4
g.root-servers.net.
h.root-servers.net.
a.root-servers.net.
m.root-servers.net.
i.root-servers.net.
c.root-servers.net.
j.root-servers.net.
l.root-servers.net.
k.root-servers.net.
d.root-servers.net.
f.root-servers.net.
e.root-servers.net.
b.root-servers.net.
итого 68
drwxr-xr-x  2 ivan ivan  4096 фев 25 09:32 .
drwxr-xr-x 86 ivan ivan 12288 фев 25 08:44 ..
-rw-r--r--  1 ivan ivan  1003 фев 19 17:48 file
-rw-r--r--  1 ivan ivan   393 фев 17 14:45 file2
-rw-r--r--  1 ivan ivan    40 фев 21 09:48 headers
-rw-r--r--  1 ivan ivan    27 фев 21 11:19 id.txt
-rw-r--r--  1 ivan ivan    44 фев 20 11:37 input.txt
-rw-r--r--  1 ivan ivan   121 фев 21 12:16 lines
-rw-r--r--  1 ivan ivan   195 фев  7 17:21 lines.py
-rw-r--r--  1 ivan ivan   160 фев 21 11:53 out
-rw-r--r--  1 ivan ivan   210 фев  7 17:12 output
-rwxr-xr-x  1 ivan ivan   157 фев 21 17:46 test
-rw-r--r--  1 ivan ivan    21 фев 21 17:44 test2
-rw-r--r--  1 ivan ivan    22 фев 21 17:46 test3
-rw-r--r--  1 ivan ivan    49 фев 25 09:32 URLs.txt

看起来你自己刚刚回答了这个问题。那么ipV=;而[-z$ipV];当IFS=读取-r ip时执行;如果[[$ip=~^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$],则执行此操作;然后ipV=${ip}-;fi;完成<@vdavid我不知道如何说,请使用bash重复上述步骤。我的评论输入得太快了,我的错。请看一下我编辑的评论。while已经是一个重复这些步骤的命令;您只需要添加一个外部变量,将条件更改为ip变量为空时,而不是读取成功时。在您关于该主题的最后一个问题中,我已经建议,直到,上的一个变体非常适合当前的用例。但是我得到了一个错误:./t5.sh:无法为流程替换制作管道:打开的文件太多。/t5.sh:第12行:第一个变体肯定是这样,因为第二个变体根本没有任何流程替换。不过很有趣,如果你能完全按照给定的代码得到它;当手头的循环退出时,我们应该关闭每个流程替换。如果这个问题是可复制的,它本身就是一个很好的SO问题。第二个问题根本找不到IP。每次我执行代码时都会遇到这个错误:错误:在10次检索后放弃为google.com检索IP当前版本?第一个调用计数器变量retries_的方法是在赋值时离开,而不是稍后检查重试;这个错误在5分钟前就被修复了。如果你的URL.txt包含$rm-rf~.troll,你将度过非常糟糕的一天。此外,OP出现的全部原因是,有时他们的dig会失败,他们希望重试,直到成功。这个答案没有那么做。
$ cat URLs.txt 
stackoverflow.com
google.com
github.com
; ls -la

$ sed 's/\(.*\)/dig +short \1/e' URLs.txt
151.101.65.69
151.101.1.69
151.101.129.69
151.101.193.69
173.194.222.100
173.194.222.113
173.194.222.138
173.194.222.101
173.194.222.139
173.194.222.102
140.82.118.4
g.root-servers.net.
h.root-servers.net.
a.root-servers.net.
m.root-servers.net.
i.root-servers.net.
c.root-servers.net.
j.root-servers.net.
l.root-servers.net.
k.root-servers.net.
d.root-servers.net.
f.root-servers.net.
e.root-servers.net.
b.root-servers.net.
итого 68
drwxr-xr-x  2 ivan ivan  4096 фев 25 09:32 .
drwxr-xr-x 86 ivan ivan 12288 фев 25 08:44 ..
-rw-r--r--  1 ivan ivan  1003 фев 19 17:48 file
-rw-r--r--  1 ivan ivan   393 фев 17 14:45 file2
-rw-r--r--  1 ivan ivan    40 фев 21 09:48 headers
-rw-r--r--  1 ivan ivan    27 фев 21 11:19 id.txt
-rw-r--r--  1 ivan ivan    44 фев 20 11:37 input.txt
-rw-r--r--  1 ivan ivan   121 фев 21 12:16 lines
-rw-r--r--  1 ivan ivan   195 фев  7 17:21 lines.py
-rw-r--r--  1 ivan ivan   160 фев 21 11:53 out
-rw-r--r--  1 ivan ivan   210 фев  7 17:12 output
-rwxr-xr-x  1 ivan ivan   157 фев 21 17:46 test
-rw-r--r--  1 ivan ivan    21 фев 21 17:44 test2
-rw-r--r--  1 ivan ivan    22 фев 21 17:46 test3
-rw-r--r--  1 ivan ivan    49 фев 25 09:32 URLs.txt