如何在csh中一行写foreach?

问题描述 投票:0回答:6

有时我对 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
6个回答
15
投票

这个方法对我有用:

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

4
投票

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

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

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

您可以在终端中拨打

disp

如果您想将结果导入管道,那么

echo `disp` | grep foobar

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

set foo=`disp`


0
投票

使用 bash -c:

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


0
投票

别名可以作为解决方法,但可能会很痛苦且受到限制。更喜欢创建脚本或 FIFO 文件。这是文件示例。

echo '\
# Functions\
alias function '\''( set argv = ( \\\!* ) ; source ~/.cshfuncs )'\' >> ~/.cshrc
echo 'switch ("$1")\
  case 'disp':\
    shift\
    foreach i (*.txt)\
      cat "$i"\
    end\
    exit\
  default:\
    echo "Function $1 not set."\
    exit\
endsw' > ~/.cshfuncs

这是 FIFO 的示例。

mkfifo ~/fifo
echo 'foreach i (*.txt)\
cat "$i"\
end' > ~/fifo & ( source ~/fifo )

-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


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


-1
投票

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

%重击

$ 代表 *txt 中的 f;做回声 $f;完成

$退出

%

© www.soinside.com 2019 - 2024. All rights reserved.