我有一个脚本,文件名中有一个字符串,如下所示:
filename_with_spaces="a file with spaces"
echo test > "$filename_with_spaces"
test_expect_success "test1: filename with spaces" "
run cat \"$filename_with_spaces\"
run grep test \"$filename_with_spaces\"
"
test_expect_success
定义为:
test_expect_success () {
echo "expecting success: $1"
eval "$2"
}
和run
定义为:
#!/bin/zsh
# make nice filename removing special characters, replace space with _
filename=`echo $@ | tr ' ' _ | tr -cd 'a-zA-Z0-9_.'`.run
echo "#!/bin/zsh" > $filename
print "$@" >> $filename
chmod +x $filename
./$filename
但是当我运行顶级脚本test_expect_success
时......我得到cat_a_file_with_spaces.run
:
#!/bin/zsh
cat a file with spaces
问题是a file with spaces
中cat_a_file_with_spaces.run
周围的引号丢失了。你如何让Z shell保持正确的引用?
由于
答案 0 :(得分:4)
尝试
run cat ${(q)filename_with_spaces}
。它是为(q)修饰符编写的。对于运行脚本也是如此:
echo -E ${(q)@} >> $filename
。它不是bash,你不需要在变量周围加上引号:除非你指定一些选项(不记得确切)
command $var
无论command
中的内容是什么,始终只将一个参数传递给$var
。要确保某些zsh选项不会改变行为,请输入
emulate -L zsh
位于每个脚本的顶部。
请注意,初始变体(run cat \"$filename_with_spaces\"
)不正确引用:filename可以包含除NULL之外的任何字符和用于分隔目录的/
。 ${(q)}
会照顾它。
更新:我会以下列方式编写test_expect_success函数:
function test_expect_success()
{
emulate -L zsh
echo "Expecting success: $1" ; shift
$@
}
用法:
test_expect_success "Message" run cat $filename_with_spaces