如何从 shell 变量中删除前导和尾随空格

如何从 shell 变量中删除前导和尾随空格

我有一个名为 tablename 的变量,它有前导空格和尾随空格(例如,

tablename= yyy 

)。我想删除前导和尾随空格(输出:

tablename=yyy

)并使用 shell 脚本将此变量写入文件,不留任何空格。

答案1

var='    A  B C  '

zsh

trim=${${var%${var##*[^[:blank:]]}}#${${var%${var##*[^[:blank:]]}}%%[^[:blank:]]*}}
printf '++%s++\n' $trim
++AB C++

bash

shopt -s extglob
trim=${var%%*([[:blank:]])}
trim=${trim##*([[:blank:]])}
printf '++%s++\n' "$trim"
++AB C++

对于任何 shell,您都可以使用附加变量来保存前导和尾随空格1(它与解决方案基本相同,zsh但没有嵌套操作):

trail=${var##*[^[:blank:]]}    # get trailing space
var=${var%${trail}}            # remove trailing space
lead=${var%%[^[:blank:]]*}     # get leading space
trim=${var#${lead}}            # remove leading space
printf '++%s++\n' "$trim"
++AB C++

1:为了清楚起见,我在这里使用两个变量来分别保存前导和尾随空白,但一个变量就可以了。

答案2

正如给出的您在其他网站上的帖子:

tablename=${tablename// }

答案3

read命令将修剪前导和尾随空白字符(由 的值定义IFS);您可以将其与此处文档一起使用来修剪空格:

IFS=' ' read tablename <<EOF
$tablename
EOF

如果您使用的是 bash(不是某些品牌的 X shell),您可以使用此处字符串而不是此处文档来简化此操作:

IFS=' ' read tablename <<<"$tablename"

请注意,由于此分配$IFS是命令的前缀read,因此它仅适用于该命令,并且之后不必重置。另外,如果您没有搞乱$IFS并且想要修剪任何制表符和空格,则IFS根本不需要设置。

答案4

echo "tablename =yyy" | tr -d ' '
tablename=yyy

相关内容