shell 如何在csh中用一行写foreach?

r7knjye2  于 2023-11-21  发布在  Shell
关注(0)|答案(6)|浏览(197)

有时我在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)。我怎么做呢?

e0bqpujr

e0bqpujr1#

这个方法对我很有效:

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

字符串

xesrikrc

xesrikrc2#

在tcsh下,没有简单的方法在一行中完成foreach。
然而,通过使用别名,你可能会得到一些非常接近你的问题。

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

字符串
您可以在终端中调用disp
如果你想把结果导入管道,那么echodisp| grep foobar
有时,我们需要先保存结果,然后再进一步处理:set foo=disp``

hpxqektj

hpxqektj3#

使用bash -c:
$ bash -c 'for i in *.txt; do cat $i; done'

nsc4cvqm

nsc4cvqm4#

别名可以作为解决方法,但可能是痛苦的和有限的。更喜欢创建一个脚本或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 )

o2gm4chl

o2gm4chl5#

对于你的第一个问题,我不知道如何直接将其写入.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
1.重新输入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表示文件的扩展名)

ghg1uchk

ghg1uchk6#

我试图找到答案,但看起来没有办法。只是通过简单地改变shell使用bash。
% bash
$ for f in *txt; do echo $f; done
$ exit
%

相关问题