我正在尝试使用另一个csh
脚本动态创建csh
echo
将一堆语句放到另一个文件上并运行它。
但我无法回复"$#argv"
和"#!/bin/csh"
第一个始终由生成器csh解析为其值#argv
,而shebang
只是出错Event not found
。有什么方法可以将这些回应到文件中吗?
我可以将生成器csh
改为bash
,但输出脚本必须是csh,因为它使用了大量的csh环境变量。
PS - 我试过echo -e并尝试在任何地方添加反斜杠但是徒劳无功。当使用单引号而不是双引号时,它也不起作用。
答案 0 :(得分:2)
csh
- 与类似POSIX的shell类似 - 使用单个引用的字符串('...'
)代表 literal 字符串(不受shell扩展影响的字符串) - 与 double - 引用字符串("..."
)形成对比,其中{{ 1}} - 前缀参考展开(插值,即时)。
因此,以下命令应该起作用:
$
然而,对% echo '$#argv'
#argv
的解释 - 命令历史记录功能 - 在之前甚至是通常的shell扩展,因此需要额外的一层使用!
逃避:
\
此外 - 再次,就像在类似POSIX的shell中一样 - 你可以混合在直接相邻的标记中引用样式到形成一个单一,复合< / em> string :
% echo '#\!/bin/csh'
#!/bin/csh
请注意仅 % set arg = 3
% echo 'if($#argv < '"$arg"') then'
if($#argv < 3) then
是如何展开(插值)的,因为$arg
中包含了(唯一的部分)。
在这种特殊情况下,{em>未加引号使用"..."
也会有效,但请注意使用包含<的未加引号的(子)字符串em>模式元字符(例如$arg
和*
) - 再次像在类似POSIX的shell中一样 - 使(整个)字符串服从< em> globbing (文件名扩展)。
答案 1 :(得分:1)
您可以使用带有转义符的echo
来获取csh
的输出:
echo '$#argv'
echo '#\!/bin/csh"
根据以下成绩单:
% cat testprog.csh
echo '$#argv'
echo '#\!/bin/csh'
% csh testprog.csh
$#argv
#!/bin/csh
%