2012-12-01 57 views

回答

5

你也可以使用echo可以刪除字符串開頭或結尾的空格,但也可以在字符串內部重複空格。

$ myVar=" kokor iiij  ook  " 
$ echo "$myVar" 
    kokor iiij  ook  
$ myVar=`echo $myVar` 
$ 
$ # myVar is not set to "kokor iiij ook" 
$ echo "$myVar" 
kokor iiij ook 
+3

這是不可靠的:如果'myVar'包含'*'之類的特殊字符,shell將使用當前目錄的文件進行擴展。 –

+0

由於#fash上freenode總是說...使用更多的引號。 '回聲「$ MYVAR」'防止水珠的擴展等 – bobpaul

+0

@bobpaul,它可以防止水珠,擴展等,而且還包括了前導和尾部空格的Mickaël意在這種情況下襬脫:( –

1

一種有趣的方式來從一個變量中刪除所有的空格是用printf:

$ myvar='a cool variable with lots of spaces in it' 
$ printf -v myvar '%s' $myvar 
$ echo "$myvar" 
acoolvariablewithlotsofspacesinit 

事實證明,這是略多於myvar="${myvar// /}"更有效,但不是安全的,可出現關於水珠(*)在字符串中。所以不要在生產代碼中使用它。

如果你真的真的想用這個方法,實在擔心文件名匹配的東西(你真的應該),你可以使用set -f(即禁用完全通配符):

$ ls 
file1 file2 
$ myvar=' a cool variable with spaces and oh! no! there is a glob * in it' 
$ echo "$myvar" 
    a cool variable with spaces and oh! no! there is a glob * in it 
$ printf '%s' $myvar ; echo 
acoolvariablewithspacesandoh!no!thereisaglobfile1file2init 
$ # See the trouble? Let's fix it with set -f: 
$ set -f 
$ printf '%s' $myvar ; echo 
acoolvariablewithspacesandoh!no!thereisaglob*init 
$ # Since we like globbing, we unset the f option: 
$ set +f 

我張貼了這個回答只是因爲它很有趣,並不是在實踐中使用它。

+0

但報價。爲了去掉空格開頭缺少明確glob的所以字符都在玩 –

+0

濃縮到一個安全的一行:'MYVAR =「$(設置-f; printf的‘%s的’$ myvar的)」;回聲「[$。 MYVAR]「' – 2015-07-28 03:10:35

3

由於您使用bash中,最快的方式是:

shopt -s extglob # Allow extended globbing 
var=" lakdjsf lkadsjf " 
echo "${var//+([[:space:]])/}" 

這是最快的,因爲它使用內置的功能,而不是發射了額外的過程。

但是,如果你想要做一個POSIX兼容的方式,使用sed

var=" lakdjsf lkadsjf " 
echo "$var" | sed 's/[[:space:]]//g' 
+0

在非交互的shell(即劇本),你需要'禁用了javascript -s extglob'的第一個。 –

+0

@glennjackman良好的漁獲物。見我的更新。 –

66

的工具sedtr會爲你做這個通過交換空白白白

sed 's/ //g'

tr -d ' '

示例:

$ echo " 3918912k " | sed 's/ //g' 
3918912k 
+3

完美的作品。這應該是公認的答案: – phpguru

+0

確實,目前接受的答案不是POSIX。對於便攜式腳本,這個答案更好。 – MoonSweep