我想遍历一组目录,从文件中读取一行,解析它以分配一个变量的值,然后在变量匹配预定义的字符串时动作。我使用“#!/斌/ bash中运行它。这里是代码。如果环路中没有评估bash
23 for DIR in $(find . -name "H[A-Z]*" -maxdepth 1); do
24 if $(test -d ${DIR}); then
25 echo $(basename ${DIR});
26 cd $(basename ${DIR});
27
28 for fname in $(find . -name "*.DAT"); do
29 echo $(basename $fname);
30 calType=$(grep 'Level_Unit' $fname | sed -e 's/.*=\([A-Z]\)/\1/');
31 echo $(basename $calType);
32 if [ "$calType" == FPL ]
33 then
34 echo "This is a keeper " $calType;
35 fi
36 done
37 cd ../
38
39 fi;
40
41 done
我倾我的终端上的输出,并在这里被我看到...
sumit$ ./harp_phaseI_calfilenames.sh
+ rm harp_Phase1_calnames1.txt
+ touch harp_Phase1_calnames1.txt
+ calTest=FPL
++ find . -name 'H[A-Z]*' -maxdepth 1
+ for DIR in '$(find . -name "H[A-Z]*" -maxdepth 1)'
++ test -d ./HALAF032
++ basename ./HALAF032
+ echo HALAF032
HALAF032
++ basename ./HALAF032
+ cd HALAF032
++ find . -name '*.DAT'
+ for fname in '$(find . -name "*.DAT")'
++ basename ./08E21D00.DAT
+ echo 08E21D00.DAT
08E21D00.DAT
++ grep Level_Unit ./08E21D00.DAT
++ sed -e 's/.*=\([A-Z]\)/\1/'
+ calType=$'V\r'
++ basename $'V\r'
+ echo $'V\r'
V
+ '[' $'V\r' == FPL ']'
+ for fname in '$(find . -name "*.DAT")'
我我反感了一阵子,并没有得到为什么在输出底部有一行“calType = $'V \ r'”六行的美元符号,那么主要问题是为什么if语句不是评估......“'['$'V \ r'== FPL']'”,我知道我提供的实例并不匹配变量的字符串,但同样的事情当$ calType是“FPL \ r”时发生。
在此先感谢。
最佳, 萨米特
你的代码有很多问题。通过shellcheck.net运行它来修复明显的问题。 – chepner
你的文件包含DOS风格的行结束符,导致你的字符串有一个尾随回车符('\ r')。您可以通过'tr -d'\ r''管道来去除它。 –