我想合併所有文件到一個。這裏最後一個參數是目標文件名。 我想採取最後一個參數,然後在最後一個參數前循環停止。如何獲取最後一個參數並在shell腳本中的最後一個參數之前停止?
下面的代碼考慮到我想要實現:
echo "No. of Argument : $#"
for i in $* - 1
do
echo $i
cat $i >> last argument(file)
done
如何實現這一目標?
我想合併所有文件到一個。這裏最後一個參數是目標文件名。 我想採取最後一個參數,然後在最後一個參數前循環停止。如何獲取最後一個參數並在shell腳本中的最後一個參數之前停止?
下面的代碼考慮到我想要實現:
echo "No. of Argument : $#"
for i in $* - 1
do
echo $i
cat $i >> last argument(file)
done
如何實現這一目標?
使用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}
非常感謝很多人.......... – LoveToCode 2014-11-02 20:54:44
的方法:
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
+ POSIX兼容性。 – John1024 2014-11-04 01:54:56
請注意,如果目標文件首先列出並且源文件之後會更容易。你會有:'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
是的,它是一個很好的邏輯...謝謝 – LoveToCode 2014-11-04 03:44:19