4

ファイル名のスペースを処理する方法の 1 つは、ファイル名を単一引用符 "'" で囲むことだと理解しています。

「echo.sh」と呼ばれる次のコードは、スペースを含むファイル名を含むディレクトリで機能しますが、プログラム「ls.sh」は機能しません。唯一の違いは「echo」が「ls」に置き換えられているのはなぜですか?

echo.sh

#!/bin/sh
for f in *
do
echo "'$f'"
done

プロデュース:
'ab c'
'de f'
'echo.sh'
'ls.sh'

しかし、「ls.sh」は失敗します:

#!/bin/sh
for f in *
do
ls "'$f'"
done

プロデュース:
ls: 'ab c' にアクセスできません: そのようなファイルまたはディレクトリはありません
ls: 'de f' にアクセスできません: そのようなファイルまたはディレクトリはありません
ls: 'echo.sh' にアクセスできません: そのようなファイルまたはディレクトリはありません
ls: ' にアクセスできません' ls.sh': そのようなファイルまたはディレクトリはありません

4

4 に答える 4

7

実際には冗長な「'」を追加しています(エコー呼び出しが示しています)

これを試して:

#!/bin/sh
for f in *
do
ls "$f"
done
于 2013-03-19T21:50:12.907 に答える
2

次の行をから変更します

ls "'$f'"

の中へ

ls "$f"
于 2013-03-19T21:44:44.423 に答える
2

echo.shスクリプトの出力を詳しく見ると、印刷されるすべての行が'次のような文字で囲まれているため、結果が期待したものとは異なる場合があります。

'file-1'
'file-2'

等々。

その名前のファイルは実際にはシステムに存在しません。それらをlslsで使用すると、'file-1'代わりにという名前のファイルが検索され、file-1そのような名前のファイルは存在しません。

あなたの例では、'sのペアを1つ追加しすぎています。ファイル名に含まれる可能性のあるスペースを処理するには、二重引用符の1つのペアで"十分です。

#!/bin/sh
for f in *
do
  ls "$f"
done

スペースを含むファイル名でも問題なく動作します。$f回避しようとしている問題は、次のように二重引用符を使用しなかった場合にのみ発生します。

#!/bin/sh
for f in *
do
  ls $f # you might get into trouble here
done
于 2013-03-19T21:45:57.587 に答える
1

これはどうですか ?=)

#!/bin/sh
for f in *; do
    printf -- '%s\n' "$f"
done
于 2013-03-19T21:53:04.100 に答える