bash/csh - 回显字符串“$#argv”和“#!/bin/csh”

bash/csh - echo the strings "$#argv" and "#!/bin/csh"

我正在尝试通过 echo 将一堆语句写入另一个文件并 运行 它来使用另一个 csh 脚本即时创建一个 csh

但我无法回显像 "$#argv""#!/bin/csh"

这样的字符串

第一个总是被生成器 csh 解析为它的值 #argvshebang 只是给出一个错误 Event not found。有什么方法可以将这些回显到文件中吗?

我同意生成器 csh 改为 bash,但输出脚本必须是 csh,因为它使用了一大堆 csh 环境变量。

PS - 我尝试了 echo -e 并尝试在任何可能的地方添加反斜杠,但没有成功。当使用单引号而不是双引号时它也不起作用。

您可以使用带转义符的 echocsh:

获取输出
echo '$#argv'
echo '#\!/bin/csh"

根据以下成绩单:

% cat testprog.csh
echo '$#argv'
echo '#\!/bin/csh'

% csh testprog.csh
$#argv
#!/bin/csh
% 

csh - 类似于 POSIX-like shells - 使用 single-quoted strings ('...') for literal strings(不受 shell 扩展的字符串)——与 double-quoted strings ("..."),其中 $-prefixed references expanded (interpolated , 即刻).

因此,以下命令应该有效:

% echo '$#argv'
#argv

然而,! 的解释 - 一个 command-history 特征 - 先于 甚至是通常的 shell 扩展,因此 需要一个额外的转义层 \:

% echo '#\!/bin/csh'
#!/bin/csh

此外 - 同样,如 POSIX-like shells - 您可以 mix 在直接相邻的标记中引用样式 形成一个 单一的,复合的 字符串 :

% set arg = 3
% echo 'if($#argv < '"$arg"') then'
if($#argv < 3) then

请注意 只有 $arg 是如何扩展(插值)的,因为(唯一的部分)包含在 "...".

在这种特殊情况下,unquoted 使用 $arg 也可以,但请注意 使用 unquoted(子)字符串包含 模式元字符 (例如 *? - 再一次,如 POSIX-like shells - 使(整个)字符串受制于 globbing(文件名扩展).