如何在csh脚本中换行

时间:2014-06-05 20:35:26

标签: line-breaks csh

您好我正在尝试在csh中创建一个脚本,我必须剪切名称字段并将其打印到屏幕上。当我执行命令(剪切/ etc / passwd -f5 -d“:”)本身它工作正常,所有名称都在不同的行,但这不会发生当我在这样的脚本中插入它:< / p>

 #!bin/csh
 set name=`cut /etc/passwd -f5 -d":"`
 echo $name

它们都是一个接一个出现的。我尝试了很多但没有工作,我做错了什么?

由于

2 个答案:

答案 0 :(得分:1)

可以这样做 - 但在我看来,这不值得做。

您可以将变量设置为包含换行符的值,但我知道这样做的唯一方法是使用带有多行字符串的set命令,并使用反斜杠来连接行。< / p>

以下是我的表现:

% ( echo -n "set name = '" ; \
  cut /etc/passwd -f5 -d":" | sed 's/$/\\\/' ; echo "'" ) \
  >! tmp
% source tmp
% echo $name:q

我必须使用$name:q而不是"$name";当我输入echo "$name"时,我收到Unmatched ".错误。

正如GigaWatt在评论中所说,如果所有人都希望显示结果,那么你最好只执行cut命令;将它保存在变量中是没有意义的。

如果您需要多次使用cut命令的输出,可以将其保存到文件中:

% cut /etc/passwd -f5 -d":" > tmp

并使用该文件的内容 - 或者如果您不想创建临时文件,则可以重新运行cut命令。

还值得注意的是,/etc/passwd文件并不一定包含有关系统上所有帐户的信息。有些系统用NIS或LDAP补充它。 getent passwd说明了所有这些(除非您有一个没有getent命令的旧系统或有限系统。

基于Bourne的shell,包括bash,倾向于更干净地处理这类事情。在bash:

$ name="$(cut /etc/passwd -f5 -d":")"
$ echo "$name"

只有最后一行末尾的最后一行才会丢失; echo命令将添加它。考虑使用除csh以外的shell,或使用Python或Perl等其他脚本语言。 csh widely considered是一种糟糕的脚本语言。

答案 1 :(得分:1)

我找到了Similar discussion。基本上,当在csh脚本中运行cut时,新行字符不会保存在变量中。所以我们使用awk添加换行符。

csh中的echo不理解\ n字符,即使使用-e选项也是如此。所以我们可以使用printf。这是答案:

#!bin/csh
set name=`cut /etc/passwd -f5 -d":" | awk '{printf("%s\\n", $0)'}`
printf "%b\n" "$name"

Harshad