Shell script issue with filenames containing spaces

五迷三道 提交于 2019-12-01 20:36:44

问题


I understand that one technique for dealing with spaces in filenames is to enclose the file name with single quotes: "'".

Why is it that the following code called, "echo.sh" works on a directory containing filenames with spaces, but the program "ls.sh" does Not work, where the only difference is 'echo' replaced with 'ls'?

echo.sh

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

Produces:
'a b c'
'd e f'
'echo.sh'
'ls.sh'

But, "ls.sh" fails:

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

Produces:
ls: cannot access 'a b c': No such file or directory
ls: cannot access 'd e f': No such file or directory
ls: cannot access 'echo.sh': No such file or directory
ls: cannot access 'ls.sh': No such file or directory


回答1:


you're actually adding redundant "'" (which your echo invocation shows)

try this:

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



回答2:


change the following line from

ls "'$f'"

into

ls "$f"



回答3:


Taking a closer look at the output of your echo.sh script you might notice the result is probably not quite the one you expected as every line printed is surrounded by ' characters like:

'file-1'
'file-2'

and so on.

Files with that names really don't exist on your system. Using them with ls ls will try to look up a file named 'file-1' instead of file-1 and a file with such a name just doesn't exist.

In your example you just added one pair of 's too much. A single pair of double quotes" is enough to take care of spaces that might contained in the file names:

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

Will work pretty fine even with file names containing spaces. The problem you are trying to avoid would only arise if you didn't use the double quotes around $f like this:

#!/bin/sh
for f in *
do
  ls $f # you might get into trouble here
done



回答4:


What about this ? =)

#!/bin/sh
for f in *; do
    printf -- '%s\n' "$f"
done


来源:https://stackoverflow.com/questions/15511006/shell-script-issue-with-filenames-containing-spaces

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!