2

好的,这就是我的全部代码我有一个新的错误:非法变量名。

当我使用以下命令执行文件时: csh filename.sh

结果是:非法变量名。

我认为问题包含在以下部分: while ( $? == 1 ) #!/bin/sh

set quitter = "N"
# Boucle sur  la condition d'arret du script:
while ( $quitter == "N" )

 # Saisie du nom de l'utilisateur :
 echo "Quel utilisateur ?"
 set a = $<
 # Mettre le résultat de la commande ps -u 
 # dans un fichier quelque soit le résultat (juste ou faux) :
 ps -u $a >&fichier
 # La varible $? vaudra 1 si la dernière commande qui a été éxcuter 
 # a retourné une erreur, 0 sinon.
 # On boucle donc j'usqu'a ce que le nom d'utilisateur soit correct:
 while ( $? == 1 )

   echo -n "Nom d'utilisateur innexistant, entrez un autre :"
   set a = $<
   ps -u $a >&fichier

commande=$(tail -$i tempfile|head -1|cut -d" " -f2)
let i=i+1
echo -n " $commande : "
case $etat
in
D) echo "endormi => ininterruptible" 
S) echo "endormi" 
R) echo "en cours" 
T) echo "stoppe" 
Z) echo "zombi" 
*) echo "inconnu" 
esac
end
 # Suppression du fichier qui a servi aux tests
 rm fichier;
 echo -n "voulez-vous quitter ? (O/N):";set quitter = $<
end
4

2 回答 2

5

您的代码似乎是 bash 和 csh 的混合,并且通过您的初始打开(shebang),您拥有#!/bin/sh,这绝对不是 csh,并且由于旧行 sh=originaUnix* Bourne *Shell 或 linux 系统可能会模棱两可为方便起见,将 /bin/bash 链接为 /bin/sh。

错误消息告诉您正确的事情,$?不是 csh 中的有效变量,您想使用等效的$status.

我无权访问 csh 来运行您的代码,但我看到了一些我质疑的事情,而且我知道有些事情对于 csh 语法是错误的。

commande=$(tail -$i tempfile|head -1|cut -d" " -f2)

不行,试试

set commande = `tail -$i tempfile|head -1|cut -d" " -f2`
# tnx to @dwalter for correct syntax on that!

csh case sytnax 是

 switch ( "$etat" )
      case D:
        echo "endormi => ininterruptible" 
      breaksw
     default:   
         echo "unknown option provided in as etat=$etat"
     breaksw
  endswitch

而且,我对此表示怀疑

ps -u $a >&fichier

你在那里的意图是什么?如果您正在写入文件fichier,我看不到您在哪里读取它。它的用途是什么?

如果您需要进一步的帮助,请编辑您的问题以包含确切的错误消息(格式为代码)。

附言

如果您将来需要使用 Unix 脚本,则通过放弃使用 csh 并转换为 ksh/bash,您的整体适销性将得到增强。与大部分代码一样bash,您最好将第一行更改为#!/bin/bash,然后研究并修复生成的错误消息。

IHTH

于 2012-12-19T13:52:07.867 回答
2

首先更改#!/bin/sh#!/bin/csh(仅出于完整性考虑)。

然后改变

commande=$(tail -$i tempfile | head -n 1|cut -d" " -f2)

set commande = `tail -$i tempfile | head -n 1|cut -d" " -f2`

你也let i=i+1应该set i = 0在顶部和病房之后使用@ i++来增加它。

下一个错误是$etat未定义。

Csh 也使用switch() case.

最好的办法是查看http://www.grymoire.com/Unix/Csh.htmlhttp://faculty.plattsburgh.edu/jan.plaza/computing/help/tcsh.htm了解更多信息关于 csh 脚本。

于 2012-12-19T15:29:50.757 回答