【问题标题】:while read -r deletes second "\"while read -r 删除第二个“\”
【发布时间】:2017-05-23 11:52:41
【问题描述】:
Here is my test file.

ckencogtapzp01.corp.kencell.co.ke,KE13-CKENCOGTAPZP01-APP-SDP-DAILY,D:\websites   ;D:\consoleapps   ;D:\Errorlogs   ;D:\Apache-Tomcat-7.0.19   ;C:\Inetpub\history   ;C:\windows\system32\msmq   ;C:\Inetpub\logs\logfiles   ;  ,05/17/2017,144.793,05/23/2017,0.116425
ckencogtapzp01.corp.kencell.co.ke,KE13-CKENCOGTAPZP01-APP-SDP-MONTHLY,D:\consoleapps   ;D:\websites   ;C:\Inetpub\history   ;C:\windows\system32\msmq   ;C:\Inetpub\logs\logfiles   ;D:\Errorlogs   ;D:\Apache-Tomcat-7.0.19   ;C:\Inetpub\history   ;C:\windows\system32\msmq   ;C:\Inetpub\logs\logfiles   ;  ,05/21/2017,145.171,No_Backup,0
ckencogtapzp01.corp.kencell.co.ke,KE13-CKENCOGTAPZP01-WIN-OS-MONTHLY,C:\   ;System State:\  ;  ,05/16/2017,31.6048,No_Backup,0
ckencogtapzp01.corp.kencell.co.ke,KE15-GENERAL-ALL-WIN-OS-MONTHLY,C:\   ;System State:\  ;Shadow Copy Components:\ ;  ,05/20/2017,33.1401,No_Backup,0

我正在做的只是尝试下面的代码

echo "Client,Policy,Selection,Full_Backup_Date,Full_Size(GB),Incr_Backup_Date,Incr_Size(GB)" > /tmp/testfinal.csv
            while read -r valid
            do
                           active=`sudo /usr/openv/netbackup/bin/admincmd/bppllist $(echo $valid | awk -F "," '{print $2}') -l | grep "INFO" |awk '{print $12}'`

                           if [ "$active" -eq 0 ]
                           then
                                           echo $valid >> /tmp/test_final.csv
                           else
                                           full=`echo $valid | awk -F "," '{print $4}'`
                                           incr=`echo $valid | awk -F "," '{print $6}'`
                                           if [ "$full" != "No_Backup" ] && [ "$incr" != "No_Backup" ]
                                           then
                                                            echo $valid >> /tmp/testfinal.csv
                                           fi
                           fi
            done</tmp/test.csv

由于某种原因,它删除了第二个“\”并添加了下一行

这是输出。

ckencogtapzp01.corp.kencell.co.ke,KE13-CKENCOGTAPZP01-APP-SDP-DAILY,D:\websites ;D:ckencogtapzp01.corp.kencell.co.ke,KE13-CKENCOGTAPZP01-APP-SDP-MONTHLY,D:ckencogtapzp01.corp.kencell.co.ke,KE13-CKENCOGTAPZP01-WIN-OS-MONTHLY,C:\ ;System State:\ ; ,05/16/2017,31.6048,No_Backup,0
ckencogtapzp01.corp.kencell.co.ke,KE15-GENERAL-ALL-WIN-OS-MONTHLY,C:\ ;System State:\ ;Shadow Copy Components:\ ; ,05/20/2017,33.1401,No_Backup,0

任何想法为什么,我试过 IFS=' ' 因为它会忽略 test.csv 中的空格,但结果是一样的。我对为什么它在看到“\c”时删除并添加下一行然后在遇到“\c”时再次删除感到头疼。

有什么建议吗?

【问题讨论】:

  • 不是因为while、aix或IFS,而是遇到\c,在echo中是“抑制进一步输出”,我用printf替换它解决了这个问题。

标签: while-loop aix ifs


【解决方案1】:

看来你的echo $valid 是罪魁祸首。 echo 的某些版本解释反斜杠序列。特别是,\c 用作“抑制换行符”转义。

printf %s "$valid" 会更好。

或者,如果您需要echo 通常添加的换行符:printf '%s\n%' "$valid"

【讨论】:

  • 将 printf "$valid\n" 等同于 printf %s "$valid"
  • 如果$valid 中有任何% 则不会
  • 是的,echo 不是标准化的(或者如果是,它不是); echo 的平台无关格式为printf
  • printf %s 将所有行打印在一起我需要将它们分开,我还看到 \Er 被特殊对待并被删除,有什么办法可以将 \ 视为文本?跨度>
  • 您可能想要添加换行符:printf '%s\n' "$valid"
【解决方案2】:

不是因为while,aix或IFS,而是因为遇到\c,在echo中是“抑制进一步输出”,我用printf替换它解决了这个问题

【讨论】:

    猜你喜欢
    • 2021-11-25
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    相关资源
    最近更新 更多