2011-02-18 2 views
3

진행률 표시 줄의 길이가 내 PuTTY 창에 따라 조정되는 효과를 얻으려고합니다. 이 효과는 wget의 진행률 막대를 통해 수행됩니다. 여기 사용 가능한 공간에 따라 진행률 막대의 크기를 조정하는 방법은 무엇입니까?

내가 진행률 표시 줄 만들기 위해 내 bash는 스크립트에서 사용하는 내 프로그램입니다 : 여기
#!/bin/bash 

maxwidth=50  # line length (in characters) 
filled_char="#" 
blank_char="." 

current=0 max=0 i=0 

current=${1:-0} 
max=${2:-100} 

if (($current > $max)) 
then 
    echo >&2 "current value must be smaller max. value" 
    exit 1 
fi 
percent=`awk 'BEGIN{printf("%5.2f", '$current'/'$max' * 100)}'` 

chars=($current*$maxwidth)/$max 
echo -ne " [" 

while (($i < $maxwidth)) 
do 
    if (($i <= $chars));then 
     echo -ne $filled_char 
    else 
     echo -ne $blank_char 
    fi 
    i=($i+1) 
done 

echo -ne "] $percent%\r" 


if (($current == $max)); then 
    echo -ne "\r" 
    echo 
fi 

내가 그것을 사용하는 방법의 예입니다

_progress_bar을,이 예에서는 모든 토르 양파 프록시 종료를 찾습니다 노드와 사용자 정의 체인 아래의 IP를 금지 :

#!/bin/bash 


IPTABLES_TARGET="DROP" 
IPTABLES_CHAINNAME="TOR" 

WORKING_DIR="/tmp/" 

# get IP address of eth0 network interface 
IP_ADDRESS=$(ifconfig eth0 | awk '/inet addr/ {split ($2,A,":"); print A[2]}') 



if ! iptables -L "$IPTABLES_CHAINNAME" -n >/dev/null 2>&1 ; then   #If chain doesn't exist 
    iptables -N "$IPTABLES_CHAINNAME" >/dev/null 2>&1    #Create it 
fi 


cd $WORKING_DIR 


wget -q -O - http://proxy.org/tor_blacklist.txt -U NoSuchBrowser/1.0 > temp_tor_list1 
sed -i 's|RewriteCond %{REMOTE_ADDR} \^||g' temp_tor_list1 
sed -i 's|\$.*$||g' temp_tor_list1 
sed -i 's|\\||g' temp_tor_list1 
sed -i 's|Rewrite.*$||g' temp_tor_list1 

wget -q -O - "https://check.torproject.org/cgi-bin/TorBulkExitList.py?ip=$IP_ADDRESS&port=80" -U NoSuchBrowser/1.0 > temp_tor_list2 
wget -q -O - "https://check.torproject.org/cgi-bin/TorBulkExitList.py?ip=$IP_ADDRESS&port=9998" -U NoSuchBrowser/1.0 >> temp_tor_list2 
sed -i 's|^#.*$||g' temp_tor_list2 



iptables -F "$IPTABLES_CHAINNAME" 


CMD=$(cat temp_tor_list1 temp_tor_list2 | uniq | sort) 
UBOUND=$(echo "$CMD" | grep -cve '^\s*$') 

for IP in $CMD; do 
    let COUNT=COUNT+1 
    _progress_bar $COUNT $UBOUND 
    iptables -A "$IPTABLES_CHAINNAME" -s $IP -j $IPTABLES_TARGET 
done 

iptables -A "$IPTABLES_CHAINNAME" -j RETURN 


rm temp_tor* 

편집 :

#!/bin/bash 

for i in {1..100}; do 
    _progress_bar $i 100 
done 
+0

'sed' 명령의 순서는 ca n 결합 되나요? 'sed 's ...; s ...; s ... 'filename' 또는'sed -e'... '-e'... '-e'... 'filename' 그리고'wget'을 파이프로 연결할 수 있습니까? 'wget ... | sed ...> filename' (두 번째 세트의 파이프도 사용할 수 있습니다 :'{wget ...; wget ...;} | sed ...> filename'). –

답변

1

tput 필요없이 더 방탄 방법하지 않는 한 :

  • 함수로 변환합니다. 별도의 파일에 보관하여 여러 스크립트에서 사용할 수있게하려면 각 스크립트에서 파일을 가져와야합니다. 이렇게하면 외부 스크립트를 반복적으로 호출하는 오버 헤드가 제거됩니다.
  • 극단적 인 속도 향상을 위해 while 루프 (어쨌든 for ((i=0; $i < $maxwidth; i++)) 루프 여야 함)를 제거했습니다.
  • 산술 표현식을 나중에 평가할 수 있도록 문자열로 설정하는 대신 즉시 평가할 수 있도록 변경했습니다.
  • 달러 기호가 산술 문맥에 나타나는 변수 이름에서 제거되었습니다.
  • echo -en에서 printf으로 변경되었습니다.
  • 다른 변경 사항이 있습니다.
  • "100.00 %"는 작은 값으로 10 진수 정렬되도록 AWK 출력을 변경했습니다.
  • 대신 내부 아웃 "의 변수 통과 사용할 AWK 명령을 변경 :.? 인용을 여기에

은 결과입니다.

_progress_bar() { 
    local maxwidth=50  # line length (in characters) 
    local filled_char="#" 
    local blank_char="." 

    local current=0 max=0 i=0 
    local complete remain 

    current=${1:-0} 
    max=${2:-100} 

    if ((current > max)) 
    then 
     echo >&2 "current value must be smaller than max. value" 
     return 1 
    fi 
    percent=$(awk -v "c=$current" -v "m=$max" 'BEGIN{printf("%6.2f", c/m * 100)}') 

    ((chars = current * maxwidth/max)) 

    # sprintf n zeros into the var named as the arg to -v 
    printf -v complete '%0*.*d' '' "$chars" '' 
    printf -v remain '%0*.*d' '' "$((maxwidth - chars))" '' 

    # replace the zeros with the desired char 
    complete=${complete//0/"$filled_char"} 
    remain=${remain//0/"$blank_char"} 

    printf ' [%s%s] %s%%\r' "$complete" "$remain" "$percent" 
} 

질문 오, BashFAQ/091을 볼 수 있었다 무엇 tput를 사용하여 또는 bash -i$COLUMNS을 사용하는 경우 bash -i을 사용하는 경우 시작 파일을 처리하는 데 오버 헤드가 발생합니다.

+0

너는 신이다. 사실 지금은 빠릅니다. – ParoX

+0

@BHare : 그런데, ['pv']에 대해 알고 있습니까? (http://www.ivarch.com/programs/pv.shtml)? –

0

배쉬는 각각 윈도우 행과 열 개수에 LINESCOLUMNS envvars 수출 : 내가 먼저 예를 들어 사람들이 그래서 여기에 사용할 수 없습니다 것을 깨달았더 간단한 개념이다. 또한 SSH 또는 텔넷 프로토콜을 통해 퍼티 창 크기를 조정할 때 프로토콜에 WINCH 신호를 활성 셸로 보내면이 값을 새 창 크기로 다시 설정하는 논리가 충분합니다. 당신의 bash는 스크립트에서

는, 현재 크기를 설정하고 100/progbarlen를 분할하는 COLUMNS 변수를 사용하여 하나의 문자를 구성하는 몇 퍼센트 포인트를 얻고, 진행로를 사전에 (progbarlen 변수 COLUMNS의 일부 기준) 따라 움직인다. 동적으로 크기 조정을 처리하려면 SIGWINCH ( trap 통해) 처리기를 추가하고 COLUMNS envvar를 다시 읽게하고 새 크기를 사용하여 진행률 막대를 다시 그립니다.

는 (I 쉘 스크립트에서이 테스트를하지 않은, 그리고 필요한 몇 가지 추가 논리가있을 수 있지만, 이것은 배쉬는/핸들 크기 조정 감지하는 방법입니다.)

+0

$ COLUMNS는 bash 스크립트에 아무런 가치가없는 것처럼 보이지만, 터미널 $ COLUMNS는 작동하는 것처럼 보입니다. – ParoX

+0

아, 맞습니다. 위의'tput'을 사용하는 위의 해결책은 좋아 보이며, 크기를 변경하면 업데이트되는 것처럼 보입니다. –

1

일부 구글 I는 다음을 발견 했는가 검색 후 :

tput cols은 Sdaz가 제안한 COLUMNS var와 같이 열의 양을 반환합니다.

그러므로 내가 함께 갈거야 : maxwidth=$(tput cols) 다른 사람이 내가 스크립트에 몇 가지 변경했다

관련 문제