bash / csh - 回显字符串" $#argv"和#34;#!/ bin / csh"

时间:2017-02-16 01:26:58

标签: bash echo sh csh

我正在尝试使用另一个csh脚本动态创建csh echo将一堆语句放到另一个文件上并运行它。

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

等字符串

第一个始终由生成器csh解析为其值#argv,而shebang只是出错Event not found。有什么方法可以将这些回应到文件中吗?

我可以将生成器csh改为bash,但输出脚本必须是csh,因为它使用了大量的csh环境变量。

PS - 我试过echo -e并尝试在任何地方添加反斜杠但是徒劳无功。当使用单引号而不是双引号时,它也不起作用。

2 个答案:

答案 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
%