我想检查目录A中的文件是否与目录B中的文件匹配,并且不会修改/更改这些匹配的文件。
我对这个新的编程环境很陌生,因为我习惯使用Windows。这个任务是学校项目的一部分,但我试图在我的Windows上使用cygwin和bash(?)运行tcsh脚本。但是,我在脚本中指定了tcsh环境。
这个简单的脚本:
#!/usr/bin/tcsh
echo Hello world;
set listing=`ls -l`
echo $listing
给我以下输出:
Shawn@Shawn-PC /cygdrive/c/Users/Shawn/Desktop
$ ./lab3.sh
Hello world
Unknown user: $372.
然而,我能够运行" ls -l"直接命令进入命令行并返回相应的结果,所以我不知道它为什么不能执行我的" ls -l"脚本中的命令。我不知道脚本中的tcsh语法是否有问题,以及为什么它会返回错误消息"未知用户:#372。"
答案 0 :(得分:1)
您可能有一个文件或目录,其名称类似于~372
,或者包含该名称的一部分。
如果您输入
echo ~372
在shell提示符下,shell将尝试将~372
扩展到名为372
的用户的主目录。几乎可以肯定,没有这样的用户 - 因此错误信息。
你的命令:
set listing=`ls -l`
无论如何都不太可能有用。 ls -l
的输出(使用对齐列的行方向)将连接成一行文本,其中多个空格由单个空格替换。这将是一个混乱,难以阅读。 (或许重点是证明这一点。)
您可以通过在反引号周围添加双引号来避免~372
上的错误:
set listing="`ls -l`"
但是现在字符串$listing
包含了麻烦的~372
,如果你尝试echo
它就会遇到同样的问题; $listing
会扩展为字符串,echo
会尝试展开其中包含的~372
。
因此 还需要添加引号(或:q
后缀) to the
echo`命令。
以下是我在系统中使用tcsh的内容:
% touch foo bar '~372'
% ls -l
total 0
-rw-r--r-- 1 kst kst 0 Sep 19 14:06 bar
-rw-r--r-- 1 kst kst 0 Sep 19 14:06 foo
-rw-r--r-- 1 kst kst 0 Sep 19 14:06 ~372
% set listing = `ls -l`
Unknown user: 372.
% set listing = "`ls -l`"
% echo $listing
Unknown user: 372.
% echo "$listing"
total 0 -rw-r--r-- 1 kst kst 0 Sep 19 14:06 bar -rw-r--r-- 1 kst kst 0 Sep 19 14:06 foo -rw-r--r-- 1 kst kst 0 Sep 19 14:06 ~372
%
这不是一件特别有用的事情,但这是怎么做的。
请注意,如果您使用的是bash,那么:
listing="`ls -l`"
echo "$listing"
会保留多行格式。
答案 1 :(得分:0)
如果您只是需要它打印到终端,那么这就是您所需要的。
#!/usr/bin/env tcsh
echo Hello world
ls -l
如果你需要将它保存为数组或其他东西,将它更容易输出到文本文件然后逐行读取它作为数组。 (间距让我直接搞砸了。)
#!/usr/bin/env tcsh
echo Hello world
ls -l > output.txt
如果这是您所需要的,请阅读将文本文件导入为数组。
此外,如果您有选择,这在bash中会更容易。