web-dev-qa-db-ja.com

bashの変数でバックスラッシュ( "\")をフォワードスラッシュ( "/")に置き換えます

バックスラッシュ(\)とスラッシュ(/)bashの変数内。私はこのように試してみましたが、うまくいきません:

home_mf = ${home//(\)//(/)}

たとえば、

\a\b\c -> /a/b/c
14
Para

正しい置換は

home_mf="${home//\\//}"

これは次のように分かれます。

  • //すべてを置き換える
  • \\バックスラッシュ
  • /
  • /スラッシュ

デモンストレーション:

$ t='\a\b\c'; echo "${t//\\//}"
/a/b/c

読みやすい別の方法は、パターンと置換を引用することです。

home_mf="${home//'\'/"/"}"
24
Toby Speight

これはそれを行います:

home_mf=${home//\//\\} # forward to backward slash
home_mf=${home//\\//} # backward to forward slash

例えば。:

猫slash.sh
#!/ bin/bash 
 set -x 
 home =/ aa/bb/cc       
 home_mf = $ {home //\//\\}
 echo $ home_mf 
 home_mf = $ {home_mf //\\//}
 echo $ home_mf 
 $ ./slash.sh
 + home = aa/bb/cc 
 + home_mf = '\ aa\bb\cc' 
 + echo '\ aa\bb\cc' 
\ aa\bb\cc
 + home_mf =/aa/bb/cc 
 + echo /aa/bb/cc
/ aa/bb/cc

${variable/..}構文はkshbash、およびおそらく他のシェル固有ですが、すべてのBourne Shell構文ベースのシェルに存在するわけではありません。 dash。ポータブルな方法(POSIX)が必要な場合は、代わりにsedを使用できます。

home_mf=$(printf "%s" "$home" | sed 's/\//\\/g')    # forward to backward slash
home_mf=$(printf "%s" "$home_mf" | sed 's/\\/\//g') # backward to forward slash
8
jlliagre