DFS経由でWindows共有をマウントするためのbashスクリプトを作成していますcifs
。私の主な部分は機能しますが、ユーザーがDFSパスを変数として入力し、バックスラッシュをスラッシュに変換する必要がある場合に問題があります。
#!/bin/bash
FILE='\\edi3\welshch\test'
FILEPATH="$("$FILE" | sed -e 's/\\/\//gp')"
echo $FILEPATH
コマンドを使用してADホームディレクトリのファイルパスを検索し、部分的にsedにパイプする別のスクリプトがあります。| sed -e 's/\\/\//gp
しかし、上記のスクリプトは私に提供しています。
./test.sh: line 10: \\edi3\welshch\test: command not found
答え1
コマンドの置き換えでは、"$FILE" | sed -e 's/\\/\//gp'
シェルはそれを(同じ)に拡張します'\\edi3\welshch\test' | sed -e 's/\\/\//gp'
。なぜなら注文する、シェルはrunというファイルを探します\\edi3\welshch\test
。
パイプされたコンテンツを使用する予定かもしれませんecho "$FILE" | sed ...
。FILE
sed
これが正しくない場合でも、一部のバージョンではecho
バックスラッシュをエスケープ文字として扱い、混乱を招きます。printf "%s\n" "$FILE" | sed ...
すべてのシェルで動作するために必要です。望むより:なぜprintfがechoより優れているのですか?
また、デフォルトの動作は、sed
操作を実行した後に行を印刷することです。/p
on コマンドを使用すると、追加のs///
印刷が発生するため、出力に結果が 2 回表示されます。
つまり、Bashを使用しているので、文字列置換拡張を使用できます。
#!/bin/bash
FILE='\\edi3\welshch\test'
FILEPATH=${FILE//\\//}
echo "$FILEPATH"
出力を提供します//edi3/welshch/test
答え2
単一の文字を置き換えるには、使いやすくなります。tr
(1):
FILE=$(echo "$FILE" | tr '\\' / )
答え3
この変数はエコーを介してsedに出力する必要があります。 sed出力を抑制するために使用されますsed -n
。編集するsed -n
- sedフラグを省略すると必要ありませんp
。
#!/bin/bash
FILE='\\edi3\welshch\test'
FILEPATH="$(echo "$FILE" | sed 's/\\/\//g')"
echo $FILEPATH