我有一个程序在命令行中读取两个单词:
#!/bin/bash
if [[ "$1" != "" && "$2" != "" ]]; then
java -Xmx1024m -cp lib/*:esalib.jar clldsystem.esa.ESAAnalyzer "$1" "$2"
else
java -Xmx1024m -cp lib/*:esalib.jar clldsystem.esa.ESAAnalyzer
fi
我将此代码替换为逐行读取文件,这是我必须阅读的文件示例:
vehicle car
computer program
volley ball
代码读取每一行并将每个单词影响到一个变量,问题出在每一行的拆分过程中,因此它对$ var1和$ var2的相同单词有影响
#!/bin/bash
while read ligne
do
var1=$(echo $ligne | cut -f1 -d-)
var2=$(echo $ligne | cut -f2 -d-)
if [[ "$var1" != "" && "$var2" != "" ]]; then
java -Xmx1024m -cp lib/*:esalib.jar clldsystem.esa.ESAAnalyzer "$var1" "$var2"
else
java -Xmx1024m -cp lib/*:esalib.jar clldsystem.esa.ESAAnalyzer
fi
done < mm.txt
但是新代码没有给出结果
答案 0 :(得分:2)
您可以使用read
读取两个变量。它们由任何IFS字符分隔,默认为空格和制表符(和换行符,但无论如何read
停在那里)。
while read -r var1 var2; do
if [[ "$var1" != "" && "$var2" != "" ]]; then
java -Xmx1024m -cp lib/*:esalib.jar clldsystem.esa.ESAAnalyzer "$var1" "$var2"
else
java -Xmx1024m -cp lib/*:esalib.jar clldsystem.esa.ESAAnalyzer
fi
done < mm.txt
要读取的-r
开关阻止它解析反斜杠转义,这通常是不合需要的行为。
答案 1 :(得分:1)
以下是调试程序的方法:
#!/bin/bash
while read ligne
do
var1=$(echo $ligne | cut -f1 -d' ')
var2=$(echo $ligne | cut -f2 -d' ')
if [[ "$var1" != "" && "$var2" != "" ]]; then
echo "$var1" '|' "$var2"
#java -Xmx1024m -cp lib/*:esalib.jar clldsystem.esa.ESAAnalyzer "$var1" "$var2"
else
echo "Vars Not Found"
#java -Xmx1024m -cp lib/*:esalib.jar clldsystem.esa.ESAAnalyzer
fi
done < mm.txt
运行此命令会提供以下输出:
vehicle car | vehicle car
computer program | computer program
volley ball | volley ball
这意味着您的cut
命令不正确。您有几个选项可以解决它:
read
作为user3035772指出。这不太灵活,因为它依赖于$IFS
的分隔符,你暗示不同意这一点。mm.txt
中的分隔符修复为-
,因为-d-
命令的cut
标志需要:
vehicle-car
computer-program
volley-ball
cut
命令以要求mm.txt
cut -f1 -d' '
中的空格分隔符。