为什么在使用子字符串时shell会删除空格?

时间:2018-03-22 02:22:28

标签: bash shell split ksh

当打印开头有空格的子字符串时,将删除前导空格。

$ line="C , D,E,";
$ echo "Output-`echo ${line:3}`";
Output-D,E,

为什么从输出中删除前导空格以及如何打印空格?

2 个答案:

答案 0 :(得分:4)

子串操作

${line:3}

将提取从位置3开始的所有字符,其确实是:[ D,E,](为了便于阅读,我添加了[])。

但是,在命令替换echo ${line:3}中,shell执行分词并删除前导空白字符,结果为D,E,

将子字符串表达式放在双引号中以保留前导空格,如下所示:

echo "Output-"`echo "${line:3}"` # => Output- D,E,

为了更清楚地理解这一点,试试这个:

line="C , D,E,"             # $() does command substitution like backquotes; it is a much better syntax
string1=$(echo "${line:3}") # double quotes prevent word splitting
string2=$(echo ${line:3})   # no quotes, shell does word splitting
string3="$(echo ${line:3})" # since double quotes are outside but not inside $(), shell still does word splitting
echo "string1=[$string1], string2=[$string2], string3=[$string3]" 

给出输出:

string1=[ D,E,], string2=[D,E,], string3=[D,E,]

另见:

答案 1 :(得分:-1)

Shell不会在参数之间保留多个空格,因此这两个空格会折叠为一个。

.toggle()

评估为:

echo "Output-`echo ${line:3}`";

echo "Output-`echo  -D,E,`";

评估为:

echo  -D,E,

换句话说,echo接收两个调用的相同参数:

-D,E,

当参数作为字符串数组到达时,结束每个字符串已被修剪(周围没有空格)。