我需要我的脚本能够接受带有空格字符的参数.例如,如果我有一个如下脚本:
for SOME_VAR in $@
do
echo "$SOME_VAR"
cd "$SOME_VAR"
done;
Run Code Online (Sandbox Code Playgroud)
如果我将参数传递给脚本(假设它被调用foo.sh)
sh foo.sh "Hello world"
Run Code Online (Sandbox Code Playgroud)
我期待脚本打印Hello world并将目录更改为Hello world.但我收到此错误消息:
hello
cd: 5: can't cd to hello
world
cd: 5: can't cd to world
Run Code Online (Sandbox Code Playgroud)
我究竟如何将带有空格字符的参数传递给shell脚本中的命令?
当我必须编写一个BASH脚本来处理任意目录树并查看任意文件并尝试确定它们之间的比较时,这一天到来了.我认为这将是一个简单的几个小时的上衣!过程 - 不是这样!
我的挂断是有时候一些白痴 - 唉! - 对不起,可爱的用户选择在目录和文件名中放置空格.这会导致我的脚本失败.
完美的解决方案,除了为那些坚持在这些地方使用空间的人威胁断头台(更不用说那些把它放在操作系统代码中的人!),可能是一个"逃避"文件和目录名称的例程我们,有点像cygwin如何将例程从unix转换为dos文件格式.在标准的Unix/Linux发行版中有这样的东西吗?
请注意,for file in *当一个人试图比较目录树时,简单的构造不能很好地工作,因为它只能在"当前目录"上工作 - 而且,在这种情况下和许多其他目录一样,不断地CD到各个目录位置会带来它自己的问题.所以,在做我的作业时,我发现这个问题处理bash for for循环中的特殊字符,并且建议的解决方案挂起了目录名称中的空格,但可以简单地像这样克服:
dir="dirname with spaces"
ls -1 "$dir" | while read x; do
echo $x
done
Run Code Online (Sandbox Code Playgroud)
请注意:上面的代码并不是特别精彩,因为while循环中使用的变量在while循环之外是不可接受的.这是因为当ls命令的输出被管道传输时,会创建一个隐含的子shell.这是我查询的关键激励因素!
...好吧,上面的代码有助于许多情况,但"逃避"角色也会非常强大.例如,上面的dir可能包含:
dir\ with\ spaces
Run Code Online (Sandbox Code Playgroud)
这已经存在了吗?我一直在忽视它?
如果没有,有没有人有一个简单的建议写一个 - 也许与sed或lex?(我对两者都不太称职.)