【问题标题】:TCSH error in foreach loop: files.list: Command not foundforeach 循环中的 TCSH 错误:files.list:找不到命令
【发布时间】:2018-10-09 11:02:03
【问题描述】:

我正在尝试将用户输入变量(文件名)传递到 tcsh 中的 foreach 循环中。例如,用户输入的变量是“files.list”(保存在与 Shell 脚本相同的文件夹中,并且正在从中运行)。

这是我的代码:

 #! /usr/bin/tcsh -f 

echo please enter files list 

set x = $<

foreach i ('$x')    
echo $i     
end

我想要将“files.list”中的每个单词输出到屏幕上。 Files.list 包含 5 行,每行都有一个文件名。

myScript22.sh
Mad45.sh
Number32.sh
killBill.sh
gotMilk.sh
bugslife.sh

我收到一个错误 - “foreach:单词没有括起来。”

会不会是'cat $x' 没有正确调用 x 变量?如果是这样,我如何设置文件以便它的内容可以循环通过?

感谢任何帮助!

【问题讨论】:

  • 你考虑过用 bash 代替吗?
  • 感谢@melpomene,我在工作中仅限于 tcsh。

标签: linux foreach tcsh


【解决方案1】:

如果你真的真的真的必须使用,那么以下是正确的方法:

#!/usr/bin/tcsh -f
echo please enter files list
set x = $<

foreach line (" `cat $x` ")
   echo "$line"
end

看到cat 命令在 之间很重要。不同之处在于,否则foreach 语句将逐字读取,而双引号版本将逐行读取。这其中的逻辑……值得怀疑。另外,我在echo 语句中引用了变量line,因为它实际上会在遇到空行时报错。

中,您只需做以下好事:

#!/usr/bin/env bash
echo "Please enter files list"
file=""
while [[ ! -e $file ]]; do read -r file; done

while read -r line; do
  echo "$line"
done < "$file"

非常重要的读物:

【讨论】:

    【解决方案2】:

    出于参考目的,我在 $x 之前缺少了 cat 命令。

    所以代码应该是:

     #! /usr/bin/tcsh -f 
    
    echo please enter files list 
    
    set x = $<
    
    foreach i ('cat $x')    
    echo $i     
    end
    

    【讨论】:

      【解决方案3】:

      您的 tcsh 脚本中有两个错误:

      1. 在 foreach 条件中的文件名前缺少 cat 命令。
      2. 在 foreach 条件中使用单引号 (' ') 而不是反引号 (``)。

      以下脚本应该适合您。

      #!/usr/bin/tcsh -f
      
      echo please enter files list 
      
      set x = $<
      
      foreach i(`cat $x`)
        echo $i
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-27
        • 1970-01-01
        • 1970-01-01
        • 2017-07-04
        • 1970-01-01
        • 2018-02-05
        • 2015-03-27
        • 1970-01-01
        相关资源
        最近更新 更多