2017-05-30 47 views
1

我寫一個簡單的腳本爲用戶在--:--:--:--:----(即10:46:02:17:2017)格式輸入一個特定的時間。我想顯示空白字段,讓光標從左側開始並從左向右移動,並用用戶輸入的數字替換-bash腳本 - 如何創建時間輸入欄

這怎麼可能最好在bash腳本實現?

回答

3

像這樣的東西應該讓你在正確的方向前進:記住

#!/bin/bash 

my_var=''; 
printf "\r--:--:--:--:----\r"; 
while [ ${#my_var} -lt 12 ]; do 
    read -s -n 1 this_char; 
    if [ "$this_char" = " " ]; then 
     this_char=0; 
    fi; 
    if [[ "$this_char" =~ [0-9] ]]; then 
     my_var="$my_var$this_char"; 
    fi; 
    hour="${my_var:0:2}" 
    min="${my_var:2:2}" 
    month="${my_var:4:2}" 
    day="${my_var:6:2}" 
    year="${my_var:8:4}" 
    printf -v my_output "\r%-2s:%-2s:%-2s:%-2s:%-4s" $hour $min $month $day $year; 
    my_output=${my_output// /-} 
    printf "%s" "$my_output" 
    output_length=${my_output%%-*} 
    output_length=${#output_length} 

    num_go_back=$((17 - ${output_length})) 
    for ((i=1; i<=$num_go_back; i++)); do 
     printf "\b"; 
    done; 
done; 
echo 

echo "hour: $hour" 
echo "min: $min" 
echo "month: $month" 
echo "day: $day" 
echo "year: $year" 

飼養,這可能不是最好的主意,因爲它是不是在命令提示符下正常的接口。您需要編輯循環以確保用戶輸入數字,並且您需要檢查字段是否爲空,並用短劃線替換它們。

+0

借調:「...這可能不是最好的主意,因爲它是不是在命令提示符下正常的接口。」 –

+1

爲什麼'seq'(一個非標準的命令不包含在shell中),與C風格的'for for循環支持相反(保證存在於bash中,無論如何你需要爲'[[$ foo =〜〜bar] ]'?我還強烈建議'printf%s「$ my_output」'而不是'echo -n $ my_output' - echo -n的行爲是[implementation-defined](http:// pubs。 opengroup.org/onlinepubs/9699919799/utilities/echo.html)。我也會考慮'printf -v my_output ...'和'my_output = $ {my_output ///- }'以避免子shell開銷 - 並且當然,你不帶引號的擴展應該被引用 –

+0

在不同的音符 - POSIX指定有意義的OS和外殼,並保留應用程序使用小寫名稱變量全部大寫的名稱;請參閱http://pubs.opengroup。 org/onlinepubs/9699919799/basedefs/V1_chap08.html,第四段 –