String Bash脚本文件读取,Bash删除空格
这个问题是我之前关于读取文件中某些行的问题的后续问题。 我阅读我的文件如下:String Bash脚本文件读取,Bash删除空格,string,bash,file,String,Bash,File,这个问题是我之前关于读取文件中某些行的问题的后续问题。 我阅读我的文件如下: while read line do if [ "$line" == "SUMMARY OF POLARIZATION CALCULATION" ]; then for i in {1..9} do read line echo $line >> ../../Summary.out done
while read line
do
if [ "$line" == "SUMMARY OF POLARIZATION CALCULATION" ]; then
for i in {1..9}
do
read line
echo $line >> ../../Summary.out
done
break
fi
done < ../Tutorial1_1.out
因此,上面的代码只取“SUMMARY..”后面的9行,并写入SUMMARY.out文件。但是,当它写入时,它会将所有间距都拧紧,因此我得到以下结果:
=======================================================================================
Value | spin | dir(1) | dir(2) | dir(3)
---------------------------------------------------------------------------------------
Electronic polarization (C/m2) sp(1) [-8.783054e-12, -8.828765e-13, 4.803326e-01]
Ionic polarization (C/m2) sp(1) [ 1.365657e-11, 1.365657e-11, -1.760570e-01]
Tot. spin polariz.=Pion+Pel (C/m2) sp(1) [ 4.873517e-12, 1.277369e-11, 3.042756e-01]
---------------------------------------------------------------------------------------
TOTAL POLARIZATION (C/m2) both [ 4.873517e-12, 1.277369e-11, 3.042756e-01]
=======================================================================================
我如何解决这个问题,是否有一个标志可以准确地读写输入文件中的字符串?我建议使用
echo "$line" >> ../../Summary.out
而不是
echo $line >> ../../Summary.out
我建议使用
echo "$line" >> ../../Summary.out
而不是
echo $line >> ../../Summary.out
告诉我我是否理解正确。如果不使用“”,字符串变量将被视为一个数组,其中只打印非空元素,而使用“”,则将其视为一个字符串?最好不要将其视为一个数组(因为
bash
也有数组)。相反,请将$line
视为一个宏。字符串$line
被变量line
的内容替换,就像echo a b
将简单地打印a b
(多个空格替换为一个空格),因此echo$line
将$line
中的任何空格视为简单的字段分隔符,每个字段之间都有一个空格。但是,为了保留前导空格和尾随空格,您需要使用IFS=read
,而不仅仅是read
,以及引用$line
的扩展。区别在于shell将参数传递给echo
命令的方式。在$line
周围不使用引号时,将对该变量求值,并将结果作为一个或多个参数传递给echo
。当您引用变量时,它将被计算,结果将作为单个参数传递给echo
。因此,当您执行$line='abc';echo$line
echo命令将获得3个参数。但是,如果您在$line
周围添加引号,那么echo将只得到一个参数(并保留空格)。请告诉我我是否理解正确。如果不使用“”,字符串变量将被视为一个数组,其中只打印非空元素,而使用“”,则将其视为一个字符串?最好不要将其视为一个数组(因为bash
也有数组)。相反,请将$line
视为一个宏。字符串$line
被变量line
的内容替换,就像echo a b
将简单地打印a b
(多个空格替换为一个空格),因此echo$line
将$line
中的任何空格视为简单的字段分隔符,每个字段之间都有一个空格。但是,为了保留前导空格和尾随空格,您需要使用IFS=read
,而不仅仅是read
,以及引用$line
的扩展。区别在于shell将参数传递给echo
命令的方式。在$line
周围不使用引号时,将对该变量求值,并将结果作为一个或多个参数传递给echo
。当您引用变量时,它将被计算,结果将作为单个参数传递给echo
。因此,当您执行$line='abc';echo$line
echo命令将获得3个参数。但如果在$line
周围添加引号,则echo将只获得一个参数(并保留空格)。