names.txt
テキストの最初の行には、次のファイルがあります。
51 Pipe-line\Closed3\00001011_-_Portfolio\UW\Old\NID50_Future_022814.xlsx
新しいファイル名を書き、次のよう\
に変更したいと思います。/
私は1つを書いていscript.sh
ますsh script.sh
。私の最初の試み...
while read one two three; do
new=$(echo $two|tr '\\' '/')
echo $one
echo $two
echo $three
echo $new
done < ./names.txt
51
Pipe-lineClosed300001011_-_PortfolioUWOldNID50_Future_022814.xlsx
Pipe-lineClosed300001011_-_PortfolioUWOldNID50_Future_022814.xlsx
この/
炭は食べました。合格したとマークされている-r
ため、/
次の試みは次のようになります。
while read -r one two three; do
new=$(echo $two|tr '\\' '/')
echo $one
echo $two
echo $three
echo $new
done < ./names.txt
51
Pipe-line\Closed3
Pipe-line/Closed3
これはファイル名の半分を占めます。何が問題なの?どのように機能させますか?
ベストアンサー1
それではなく、read
それecho
。
私は1つを書いてい
script.sh
ますsh script.sh
。
DebianとUbuntuでは、sh
isはdash
引数echo
のCスタイルバックスラッシュエスケープを評価します。
$ dash -c 'foo="foo\000bar"; echo "$foo"; printf "%s\n" "$foo"'
foo
foo\000bar
\000
明らかに、出力文字列を終了するNULバイトに変換されますecho
。変数を引用すると、echo
バックスラッシュを処理するコマンド自体が実行される前にシェルのコマンドライン処理のみが変更されるため、ここでは役に立ちません。
これは既知の移植性の問題であり、ここで詳しく説明します。なぜprintfがechoより優れているのですか?
たとえば、echo
Bashは引数が与えられるとバックスラッシュを処理します-e
。
この質問はもともとタグ付けされました。強く打つしたがって、Bashを使用してスクリプトを実行するには、bash script.sh
代わりにrunを使用してくださいsh script.sh
。