Shell程式碼塊重定向

2020-07-16 10:04:46
所謂程式碼塊,就是由多條語句組成的一個整體;for、while、until 迴圈,或者 if...else、case...in 選擇結構,或者由{ }包圍的命令都可以稱為程式碼塊。
請轉到《Shell組命令》了解更多關於{}的細節。
將重定向命令放在程式碼塊的結尾處,就可以對程式碼塊中的所有命令實施重定向。

【範例1】使用 while 迴圈不斷讀取 nums.txt 中的數位,計算它們的總和。
#!/bin/bash

sum=0
while read n; do
    ((sum += n))
done <nums.txt  #輸入重定向
echo "sum=$sum"
將程式碼儲存到 test.sh 並執行:
[c.biancheng.net]$ cat nums.txt
80
33
129
71
100
222
8
[c.biancheng.net]$ . ./test.sh
sum=643

對上面的程式碼進行改進,記錄 while 的讀取過程,並將輸出結果重定向到 log.txt 檔案:
#!/bin/bash

sum=0
while read n; do
    ((sum += n))
    echo "this number: $n"
done <nums.txt >log.txt  #同時使用輸入輸出重定向
echo "sum=$sum"
將程式碼儲存到 test.sh 並執行:
[c.biancheng.net]$ . ./test.sh
sum=643
[c.biancheng.net]$ cat log.txt
this number: 80
this number: 33
this number: 129
this number: 71
this number: 100
this number: 222
this number: 8

【範例2】對{}包圍的程式碼使用重定向。
#!/bin/bash

{
    echo "C語言中文網";
    echo "http://c.biancheng.net";
    echo "7"
} >log.txt  #輸出重定向

{
    read name;
    read url;
    read age
} <log.txt  #輸入重定向

echo "$name已經$age歲了,它的網址是 $url"
將程式碼儲存到 test.sh 並執行:
[c.biancheng.net]$ . ./test.sh
C語言中文網已經7歲了,它的網址是 http://c.biancheng.net
[c.biancheng.net]$ cat log.txt
C語言中文網
http://c.biancheng.net
7