如何在csh的一行中编写foreach?

时间:2014-09-12 12:27:42

标签: shell foreach csh

有时我在csh中对不同的目标文件使用相同的foreach操作 如果我可以在一行中给出foreach命令,我可以轻松地替换目标文件名来重复该过程。(我通常使用`find.-name ...`作为目标文件)
出于这个问题的目的,我们假设我想要捕获所有* .txt文件。

$ foreach i (*.txt)
foreach? cat $i
foreach? end

我看了https://unix.stackexchange.com/questions/32873/running-a-full-foreach-command并尝试了

alias disp 'echo "foreach i (*.txt)"; echo "cat "\$"i"; echo "end"; | /bin/csh'

当我输入disp时,它会给我Invalid null command 如果我可以在一行中完成,我可以!foreach:gs/\.c\>/.h/(用.h做同样的替换.c)。 我该怎么办?

5 个答案:

答案 0 :(得分:4)

此方法对我有用:

printf 'foreach f ( 1 2 3 )\n echo $f \n end' | tcsh

答案 1 :(得分:1)

在tcsh下,没有简单的方法可以在一行中执行foreach。

但是,通过使用别名,您可能会得到与您的问题非常接近的内容。

SSRS

您可以在终端中拨打alias disp 'foreach i (*.txt)\ cat $i\ end'

如果要将结果导入管道,请disp

有时,在进一步处理之前,我们需要先保存结果:echo `disp` | grep foobar

答案 2 :(得分:0)

我试图找到答案,但看起来没有办法。只需更改shell即可使用bash。

%bash

$ for f in * txt;回声$ f;完成

$ exit

答案 3 :(得分:0)

使用bash -c:

$ bash -c'for i in * .txt;做猫我;完成“

答案 4 :(得分:-1)

关于你的第一个问题,我不知道如何直接在.cshrc文件中写这个。

但我会用另一种灵活的方式来做到这一点。

1:编写shell脚本: /home/user/disp.sh(或您想要的任何路径)

#/bin/bash
for line in `find . -name "*.c"`; do
echo ""
   cat "$line"
done

或者你只有csh shell:

#/bin/csh
foreach i (*.c)
    echo $i
end
  1. 将新别名命令添加到.cshrc文件

    alias disp /home/user/disp.sh

  2. 重新输入csh shell(或重新登录)

    csh


  3. 对于你的第二个问题,我是在同一个disp.sh脚本

    上做的

    此示例使用bash shell脚本编写。

    #/bin/bash
    usage() { echo "Usage: $0 [-d <depth>] [-e <extension>]" 1>&2; exit 1; }
    while getopts ":d:e:" o; do
        case "${o}" in
            d)
                d=${OPTARG}
                ;;
            e)
                e=${OPTARG}
                ;;
            *)
                usage
                ;;
        esac
    done
    shift $((OPTIND-1))
    if [ -z "${d}" ] || [ -z "${e}" ]; then
        usage
    fi
    
    for line in `find . -maxdepth ${d} -name "*.${e}"`; do
    echo ""
       cat "$line"
    done
    

    您只需键入disp -d 1 -e c即可找到当前路径中的所有.c文件。 (-d表示从当前路径开始的文件深度,-e表示文件扩展名)