read -rがテキストを食べるのはなぜですか? [コピー]

read -rがテキストを食べるのはなぜですか? [コピー]

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では、shisはdash引数echoのCスタイルバックスラッシュエスケープを評価します。

$ dash -c 'foo="foo\000bar"; echo "$foo"; printf "%s\n" "$foo"' 
foo
foo\000bar

\000明らかに、出力文字列を終了するNULバイトに変換されますecho。変数を引用すると、echoバックスラッシュを処理するコマンド自体が実行される前にシェルのコマンドライン処理のみが変更されるため、ここでは役に立ちません。

これは既知の移植性の問題であり、ここで詳しく説明します。なぜprintfがechoより優れているのですか?

たとえば、echoBashは引数が与えられるとバックスラッシュを処理します-e

この質問はもともとタグ付けされました。したがって、Bashを使用してスクリプトを実行するには、bash script.sh代わりにrunを使用してくださいsh script.sh

おすすめ記事