2017-08-31 49 views
0

問題慶典 - 設置變量值不工作

我的bash腳本遍歷一堆文件,如果發現一個包含一些文本意想不到的文件,它設置了一個錯誤標誌,並應該退出循環。問題是,當我評估循環後的錯誤情況時,錯誤標誌設置不正確。 我似乎無法看到錯誤在哪裏。

代碼

#!/bin/sh 
valid=1 
grep -rs -L 'bogustext' * | while read line; do 
    echo "Processing file '$line'" 
    if [ "$line" != "arc/.keep" ] && [ "$line" != "arc/prp/lxc" ] && [ "$line" != "arc/lbb/lxc" ]; then 
     valid=0 
     echo "just set it to zero - $valid" 
     break 2 
    fi 
done 
echo "$valid" 
if [ "$valid" -eq 0 ]; then 
    echo "1..1" 
    echo "not ok $line invis malformed" 
else 
    echo "1..1" 
    echo "ok" 
fi 

下面是這說明這個問題/錯誤的輸出。正如你所看到的,列表中有一個額外的文件,其中包含僞造字符串「arc/ttp」。該腳本將「有效」變量設置爲0,但在我準備評估它以顯示正確的狀態時,它仍然是原始值。

lab-1:/var/vrior# sh test.sh 
Processing file 'arc/.keep' 
Processing file 'arc/prp/lxc' 
Processing file 'arc/lbb/lxc' 
Processing file 'arc/ttp' 
just set it to zero - 0 
1 
1..1 
ok 

什麼我試過到目前爲止 我目前谷歌搜索,看看是否在Bash中有局部變量與全局。不太確定,但如果你看到我的錯誤,請告訴我。

+0

此外,[BashFAQ/024](http://mywiki.wooledge.org/BashFAQ/024 ):「我在一個管道中的循環中設置變量,爲什麼在循環終止後它們消失了?或者,爲什麼我不能通過管道數據讀取?」 –

+0

謝謝@BenjaminW。問題是我是一個shell編程的noob,所以我甚至不知道要搜索什麼。甚至不知道「|」被稱爲管道。但現在我知道了!感謝您的鏈接 – dot

回答

2

管道創建子殼體,因此循環內的$valid引用了一個新變量,在嘗試使用它之前該變量會消失。

既然你標記bash中,則可以使用一個過程替代,而不是管:

while read line; do 
    echo "Processing file '$line'" 
    if [ "$line" != "arc/.keep" ] && [ "$line" != "arc/prp/lxc" ] && [ "$line" != "arc/lbb/lxc" ]; then 
     valid=0 
     echo "just set it to zero - $valid" 
     break 2 
    fi 
done < <(grep -rs -L 'bogustext' *) 
+0

謝謝湯姆。我正在嘗試這個嘗試,但你認爲有「<<」?有一個空間嵌入?因爲我得到了關於「意外的重定向」在這條線上的錯誤 – dot

+0

@dot你應該確保你使用bash。在腳本的頂部使用'#!/ bin/bash'。如果你需要用另一個shell來完成,可以通過其他方法來實現。 –