您好我正在尝试在csh中创建一个脚本,我必须剪切名称字段并将其打印到屏幕上。当我执行命令(剪切/ etc / passwd -f5 -d“:”)本身它工作正常,所有名称都在不同的行,但这不会发生当我在这样的脚本中插入它:< / p>
#!bin/csh
set name=`cut /etc/passwd -f5 -d":"`
echo $name
它们都是一个接一个出现的。我尝试了很多但没有工作,我做错了什么?
由于
答案 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