Я хочу заменить обратную косую черту (\
) на прямую косую черту (/
) в переменной в bash.
Я попробовал это так, но это не работает:
home_mf = ${home//(\)//(/)}
Например, я хотел бы
\a\b\c -> /a/b/c
Я хочу заменить обратную косую черту (\
) на прямую косую черту (/
) в переменной в bash.
Я попробовал это так, но это не работает:
home_mf = ${home//(\)//(/)}
Например, я хотел бы
\a\b\c -> /a/b/c
Правильная замена
home_mf="${home//\\//}"
Это разбивается следующим образом:
//
заменить каждый\\
обратная косая черта/
с/
косая чертаДемонстрация:
$ t='\a\b\c'; echo "${t//\\//}"
/a/b/c
Это сделает это:
home_mf=${home//\//\\} # forward to backward slash
home_mf=${home//\\/\/} # backward to forward slash
например:
$ cat 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/..}
является специфичным для ksh
, bash
и, возможно, других оболочек, но не присутствует во всех оболочках, основанных на синтаксисе оболочки Bourne, например, 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