シェル変数から先行および末尾のスペースを削除する方法

シェル変数から先行および末尾のスペースを削除する方法

先頭と末尾のスペースを持つtablenameという変数があります(例:

tablename= yyy 

)。先行スペースと末尾のスペースを削除したい(出力:

tablename=yyy

)そしてシェルスクリプトを使用してスペースを残さずにこの変数をファイルに書き込みます。

答え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++

すべてのシェルに対して追加の変数を使用して、先行スペースと末尾のスペースを保持できます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つの変数を使用して前のスペースと末尾のスペースを別々に保持しますが、1つの変数が可能です。

答え2

与えられたように他サイトの投稿:

tablename=${tablename// }

答え3

このreadコマンドは、先頭と末尾の空白文字をトリムします(値として定義されていますIFS)。スペースをトリミングするためにここのドキュメントで使用できます。

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

bash(Xシェルブランドではない)を使用している場合は、ここにあるドキュメントの代わりにここにある文字列を使用して単純化できます。

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

この割り当ては$IFSコマンドのプレフィックスなので、readそのコマンドにのみ適用され、後でリセットする必要はありません。また、混乱せずに$IFSタブやスペースを切り取りたい場合は、IFSまったく設定する必要はありません。

答え4

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

関連情報