2014-11-02 70 views
0

我想合併所有文件到一個。這裏最後一個參數是目標文件名。 我想採取最後一個參數,然後在最後一個參數前循環停止。如何獲取最後一個參數並在shell腳本中的最後一個參數之前停止?

下面的代碼考慮到我想要實現:

echo "No. of Argument : $#" 
for i in $* - 1 
do 
    echo $i 
    cat $i >> last argument(file) 
done 

如何實現這一目標?

+1

請注意,如果目標文件首先列出並且源文件之後會更容易。你會有:'target =「$ 1」;轉移;貓「$ @」>「$ target」'它不會依賴Bash。 GNU命令['mv'](http://linux.die.net/man/1/mv)和['cp'](http://linux.die.net/man/1/cp)已經修改爲支持「-t destination」選項來指定目標目錄,這與我所建議的類似。 – 2014-11-03 01:38:31

+2

是的,它是一個很好的邏輯...謝謝 – LoveToCode 2014-11-04 03:44:19

回答

3

使用bash

fname=${!#} 
for a in "${@:1:$# - 1}" 
do 
    echo "$a" 
    cat "$a" >>"$fname" 
done 

bash,最後一個參數的腳本是${!#}。所以,這就是我們獲取文件名的地方。

bash還允許從數組中選擇元素。要開始一個簡單的例子,觀察:

$ set -- a b c d e f 
$ echo "${@}" 
a b c d e f 
$ echo "${@:2:4}" 
b c d e 

在我們的例子中,我們要選擇從第一到第二要素持續。第一個是號碼1。最後是號碼$#。我們要選擇除最後一個以外的所有內容。因此我們想要數組的$# - 1元素。因此,從第一個參數到倒數第二,我們使用:符合POSIX標準的

${@:1:$# - 1} 
+2

非常感謝很多人.......... – LoveToCode 2014-11-02 20:54:44

2

的方法:

eval last_arg=\$$# 
while [ $# -ne 1 ]; do 
    echo "$1" 
    cat "$1" >> "$last_arg" 
    shift 
done 

這裏,eval是安全的,因爲你只擴展一個只讀參數eval將執行的字符串中。如果您不想通過shift取消位置參數的設置,則可以使用計數器儘早跳出循環來遍歷它們。

eval last_arg=\$$# 
i=1 
for arg in "[email protected]"; do 
    echo "$arg" 
    cat "$arg" >> "$last_arg" 
    i=$((i+1)) 
    if [ "$i" = "$#" ]; then 
     break 
    fi 
done 
+0

+ POSIX兼容性。 – John1024 2014-11-04 01:54:56

相關問題