2014-09-12 16 views
4

有時我在csh中對不同的目標文件使用相同的foreach操作。
如果我可以在一行中給foreach命令,我可以很容易地替換目標文件名來重複這個過程(我通常使用`find。-name ...`作爲目標文件)
爲此目的問題,我們假設我想要捕獲所有* .txt文件。如何在csh的一行中編寫foreach?

$ 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)。 我該怎麼辦?

回答

-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 
  • 添加新的別名命令到.cshrc文件

    alias disp /home/user/disp.sh

  • 重新輸入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表示文件的擴展名)

    +0

    您好,我想你沒有得到問題的權利。我想在單行中使用整個foreach命令,以便我可以替換它的一部分並輕鬆地再次運行該命令。在bash中,我可以簡單地爲'1 2 3;做echo $ i;完成'。 – 2016-08-23 02:37:10

    0

    我試圖找到答案,但它看起來沒有辦法。只需更換shell即可使用bash。

    %bash

    $ for f in * txt;做echo $ f;做

    $退出

    0

    有沒有簡單的方法做的foreach在一行tcsh下。

    但是,通過使用別名,您可能會得到與您的問題非常接近的內容。

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

    您可以在您的終端中撥打disp

    如果要將結果導入管道,則echo `disp` | grep foobar

    有時候,我們需要先保存結果,在進一步處理前:set foo=`disp`