我在目录 /home/test/javacall
中有以下脚本,它解析 IP 对的 csv,调用 sh 文件,该文件调用可执行 jar 以从这些 IP 获取输出。
在下面的代码中,ip1=${IPArray[0]}
从java抛出UnknownHostException
。
但是如果我直接使用ip ip1="10.10.10.10"
java代码工作正常。我从 java 执行了 System.out.println,并且在两种情况下都显示了相同的 IP。但仅在 ip1=${IPArray[0]}
的情况下,我得到了异常。
#!/bin/bash
INPUT="IPPairs.csv"
array=()
while IFS="," read var1 var2 ; do
echo $var1 $var2
pairString="$var1***$var2"
array+=("$pairString")
done < $INPUT
for i in "${array[@]}" ; do
echo $i
IPString=$(echo $i | tr '***' ' ')
read -ra IPArray <<< "$IPString"
ip1=${IPArray[0]}
#ip1="10.10.10.10"
ip2=${IPArray[1]}
source /home/test/javacall/javacmd.sh "$ip1" "/home/test/javacall/out.txt" "show running-config all-properties"
done
异常(exception):
com.jcraft.jsch.JSchException: java.net.UnknownHostException: 10.10.10.10
at com.jcraft.jsch.Util.createSocket(Util.java:349)
at com.jcraft.jsch.Session.connect(Session.java:215)
at com.jcraft.jsch.Session.connect(Session.java:183)
最佳答案
该字符串 (357\273\277) 表示您的 csv 文件使用 Byte-Order Mark 进行编码。 (BOM) 位于文件的前面。 read
命令不会将 BOM 解释为具有特殊含义,只是传递原始字符,因此您可以将它们视为输出的一部分。
由于您没有指明源文件是如何生成的,因此您可以调整该端的设置以防止写入 BOM,这在许多情况下是可选的。或者,您可以在脚本方面通过多种方式解决这个问题。这些问题都提供了一些例子:
How can I remove the BOM from a UTF-8 file?
Cygwin command not found bad characters found in .bashrc 357\273\277
但说实话,如果您遵循 Charles Duffy 的建议并在解析文件之前通过 dos2unix 运行您的文件,它应该会自动为您清理这些内容。即:
...
array=()
dos2unix $INPUT
while IFS="," read var1 var2 ; do
...
或者,基于 Charles 的版本构建:
#!/usr/bin/env bash
case $BASH_VERSION in ''|[123].*) echo "ERROR: Bash 4.0+ needed" >&2; exit 1;; esac
INPUT="IPPairs.csv"
declare -A pairs=( )
dos2unix $INPUT
while IFS=$',\r' read -r var1 var2 _ ; do
pairs[$var1]=$var2
done <"$INPUT"
for ip1 in "${!pairs[@]}"; do
ip2=${pairs[$ip1]}
# Using printf %q causes nonprintable characters to be visibly shown
printf 'Processing pair: %q and %q\n' "$ip1" "$ip2" >&2
done
请注意,在脚本中运行 dos2unix 不一定是最好的方法,因为文件只需要转换一次。一般来说,它不会造成任何损害,尤其是对于这么小的文件。尽管如此,更好的方法是运行 dos2unix 作为将 csv 推送到服务器的任何进程的一部分,并将其排除在该脚本之外。
关于java - IP 作为 Linux 数组元素会抛出 UnknownHostException 但作为常量可以正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56001930/