当这些参数中有空格时,我试图弄清楚如何处理bash脚本的参数。
要将这个问题归结为最简单的方法,请考虑使用提供的参数简单地执行ls
的脚本...
#!/bin/bash
echo $1
ls $1
请考虑以下文件夹结构:
当我使用没有空格的文件夹运行它时,它会起作用:
$ ./my_ls.sh ~/Documents/Temp/Foo
/Users/user_name/Documents/Temp/Foo
Test
当我尝试对带有空格的文件夹执行相同操作时,出现一些错误:
$ ./my_ls.sh "~/Documents/Temp/Bar Baz"
~/Documents/Temp/Bar Baz
ls: Baz: No such file or directory
ls: ~/Documents/Temp/Bar: No such file or directory
我尝试使用反斜杠,但无济于事:
$ ./my_ls.sh ~/Documents/Temp/Bar\ Baz
/Users/user_name/Documents/Temp/Bar Baz
ls: /Users/user_name/Documents/Temp/Bar: No such file or directory
ls: Baz: No such file or directory
当文件夹/文件名中有空格时,该如何指代?
我发现修复脚本的一种方法是使用引号:
#!/bin/bash
echo $1
ls "$1"
...,并且在运行脚本时,请使用反斜杠转义(而不是引号)。
但是,这似乎违反直觉,因为如果我们知道反斜杠是运行脚本(./my_ls.sh ~/Documents/Temp/Bar\ Baz
)的方式,为什么我在运行ls
(ls "$1"
时使用引号?这些似乎在这里应该是一致的。我想念什么?在处理用户提供的参数时是否有一般的最佳做法(例如,始终假定他们使用反斜杠引号,并且引用目录的参数中可能有空格)?
更奇怪的是,当我通过命令行在ls
中使用引号时,它会失败:
$ ls "~/Documents/Temp/Bar Baz"
ls: ~/Documents/Temp/Bar Baz: No such file or directory
那么,为什么要在bash脚本中添加引号呢?