【问题标题】:how to write foreach in one line in csh?如何在csh的一行中编写foreach?
【发布时间】:2014-11-06 15:16:43
【问题描述】:

有时我对 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 做同样的事情)。 我该怎么做?

【问题讨论】:

    标签: shell foreach csh


    【解决方案1】:

    这个方法对我有用:

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

    【讨论】:

    • 哇,这是一个长期没有答案的问题,但你的答案做到了!谢谢!
    • 末尾应该有换行符printf 'foreach f ( 1 2 3 )\n echo $f \n end \n' | tcsh
    • printf 比 echo 有什么优势吗?
    【解决方案2】:

    在 tcsh 下的一行中进行 foreach 没有简单的方法。

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

    alias disp 'foreach i (*.txt)\
      cat $i\
    end'
    

    您可以在终端中拨打disp

    如果你想将结果导向管道,那么echo `disp` | grep foobar

    有时,我们需要先保存结果,然后再进行进一步处理:set foo=`disp`

    【讨论】:

    • 我比涉及启动子外壳的答案更喜欢这个答案。想要在一行中执行此操作的最常见原因是用作别名,这解决了它。
    • 这种方法的一个缺点是历史记录混乱。它看起来像: disp\n cat $i\n end\n
    【解决方案3】:

    对于你的第一个问题,我不知道如何直接在 .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


    对于你的第二个问题,我是在同一个 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 表示文件扩展名)

    【讨论】:

    • 您好,我认为您的问题没有正确回答。我想在单行中使用整个 foreach 命令,以便我可以替换其中的一部分并轻松地再次运行该命令。在 bash 中,我可以简单地做 for i in 1 2 3; do echo $i; done
    【解决方案4】:

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

    % 重击

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

    $ 退出

    %

    【讨论】:

      【解决方案5】:

      使用 bash -c:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-02
        • 1970-01-01
        • 2017-12-06
        • 1970-01-01
        • 2011-07-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多