【问题标题】:How to assign variables in a csh script and used them as arguments for that same script?如何在 csh 脚本中分配变量并将它们用作同一脚本的参数?
【发布时间】:2017-06-16 08:57:57
【问题描述】:

早安,

希望在此得到任何人的帮助,在此先感谢。 我有 T.csh,它看起来像这样:

#! /bin/csh

set a="01 02 03 04 05 06 07 08 09 10 11 12 13"
set b="14 15 16 17 18 19 20 21 22 23 24 25"
set c="01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25"

set X = `grep $1 EOL.txt | head -n1 | cut -d- -f1`
printf "$X\n$2\n$3\nYYYY\n1\nN\n"

变量 a、b 和 c 可选地用作 printf 行中的第三个参数。问题是,每当我尝试运行脚本时,它都会显示未定义的变量。每当我以交互方式分配这些命令行时,它们就可以工作,但在脚本内部,它似乎不起作用。也许我需要初始化它,但不知道怎么做。刚接触这个编程的东西,我希望这里有人可以帮助我。提前非常感谢。

以下是示例执行和错误供您参考:

CAT-46{bc2}40>set a="01 02 03 04 05 06 07 08 09 10 11 12 13"
CAT-46{bc2}41>./T.csh 4773 XXXX.XX "$a"
62
XXXX.XX
01 02 03 04 05 06 07 08 09 10 11 12 13
82869
1
N
CAT-46{bc2}42>unset a
CAT-46{bc2}43>./T.csh 4773 XXXX.XX "$a"
a: Undefined variable
CAT-46{bc2}44>

如果我手动设置变量,没关系,但是当我从脚本中调用它时,它的标记未定义变量错误。

迈克

【问题讨论】:

  • 将您看到的确切错误粘贴到您的问题中。
  • AND 显示包含 $a、$b、$c 的用法。根据昨天对 csh 的另一个 Q,我相信 csh 会阻塞变量赋值中的空格。 (即使它们被引用)。因此,在花费大量时间之前,请确保您可以简单地使用其中一个变量(其中包含空格)。请参阅 grymoire.com/unix/csh.html 以获得合理的 csh 教程和讨论为什么您可能想要使用 bash 如果可以的话。祝你好运。

标签: unix set printf echo csh


【解决方案1】:

我发布了另一个答案,因为评论太短了。请看以下内容。

我有一个名为 /tmp/T.csh 的脚本:

#!/bin/csh
set a="blah"
echo $a
  1. 我的 shell 是 bash;我输入/tmp/T.csh:结果是blah(csh 执行了脚本)。
  2. 仍在 bash 中;我输入unset a; /tmp/T.csh $a:结果是一样的。
  3. 仍在 bash 中;我输入. /tmp/T.csh:没有结果(bash 执行了脚本)。
  4. 我输入csh;现在我在 csh。
  5. 我输入/tmp/T.csh:结果是blah(当然)。
  6. 我输入/tmp/T.csh $a:“a:未定义的变量”
  7. set a = something
  8. /tmp/T.csh $a:废话
  9. echo $a:某事
  10. unset a
  11. echo $a: "a: 未定义变量"

我复制了你所做的一切;希望这可以帮助。 在命令行上写的内容会出错,而不是脚本的内容。即使是简单的echo,如您在上面看到的,如果您在命令行上引用一个不存在的变量,也会出现错误。

【讨论】:

  • 这是否意味着除非我以交互方式设置它们,否则我不能调用 a、b 和 c 的值?是否有另一种方法可以在需要它们作为脚本参数时调用这些变量,因为我已经将它们设置为脚本?
  • 我不明白你想要什么。考虑一个 csh 脚本有它的局部变量,并且你从命令行传递给它arguments。可能setenv 是你的朋友,阅读它,或者如前所述,使用更友好的外壳。
  • 好的,我在这里选择的命令可能有问题,我真正想要的是将某些数字组(与我的示例相同)分配给变量,对于这种情况 a、b 和 c稍后用作我的脚本的参数。我认为 set 可以解决问题。知道我该怎么做吗?使用其他shell类型恐怕是不可能的,并且尽可能地没有变量的交互式设置..
  • 同样的错误@linuxfan,未定义的变量也在执行时。对此还有其他想法吗?
  • @Mike 为我工作。您的脚本可以使用$1$2...(如果参数在命令行中)或$varname(如果它们已经在环境中设置)。在运行脚本之前,您必须使用setenv 设置环境。总是使用setenv,并且经常使用echo。你会明白的。或者,发布另一个包含完整会话、预期结果和实际结果的问题。
【解决方案2】:
prompt> unset a
prompt> ./T.csh 4773 XXXX.XX "$a"

第一个命令“unset a”删除变量。在第二个命令中,您尝试读取变量(在命令行上!)。这就是 csh 抱怨的原因。

【讨论】:

  • 嗨@linuxfan,我刚刚在那个例子中展示了set命令正在我的shell上运行。在 T.csh 中,我也声明了相同的 set 命令,所以我希望在执行它时也可以调用它,但它不是。
  • 没有。集合 does 在 T.csh 中工作(前提是 csh 确实在 /bin 中 - 你确定吗?)。但是,如果您以交互方式执行“取消设置 a”,然后执行“blabla $a”,则 that 将无法正常工作。
  • 在这种情况下无需取消设置变量。至于 csh,它在 /bin 中。知道为什么尽管在脚本中进行了声明,但在执行 T.csh 时它会显示未定义的变量吗?
猜你喜欢
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
  • 2018-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-27
  • 2020-08-19
相关资源
最近更新 更多