Linux Shell學習(6)

1. A yes/no dialog box
dialog --common-options --yesno text height width
e.g.
dialog --title "Confirm Infomation" --yesno "Are you sure to continue?" 7 60
(我想到,利用Linux C和shell混合編程能夠比較容易得作到和用戶經過這種dialog交互。好比Linux 程序須要用戶輸入,能夠調用shell中的dialog命令,獲取用戶輸入,而後將結果返回給shell

主進程。這避免了利用GTK或者QT編程的麻煩。回想學校裏的BBS客戶端TERM,徹底就是在控制檯下跑的,既能夠查看貼子,又能夠回覆,發帖,發郵件,真的很強大。若是在和用戶的交互中編程

沒有多媒體信息的話,利用這種方式已經足夠了。另外,這種程序的移植性很是高。只要是支持標準c庫、支持shell的Linux平臺,均可以跑這種程序。)bash


2. 得到文件或者目錄的絕對路徑
root@localhost :/home/James/mypro/shell# ./getrealpath.sh menu.sh TryOut/ ../Linux-Pro/pipe/test.c
menu.sh -- /home/James/mypro/shellmenu.sh
TryOut/ -- /home/James/mypro/shell/TryOut
../Linux-Pro/pipe/test.c -- /home/James/mypro/Linux-Pro/pipetest.capp

#!/bin/bash                                                                                                                                                             
#get realpath of a file or a directory                                                                                                                                  
#getrealpath filename1 dirname1 ....                                                                                                                                    

#realpath() takes one para, that is a file name or a dirctory name                                                                                                      
realpath() {
    name=$1
    if [ -d $name ]; then
        old_pwd=$(pwd)
        cd $name
        new_pwd=$(pwd)
        cd $old_pwd
        echo $new_pwd
    fi

    if [ -f $name ]; then
        base=$(basename $name)
        dir=$(dirname $name)
        old_pwd=$(pwd)
        cd $dir
        new_pwd=$(pwd)
        new_name=$new_pwd$base
        cd $old_pwd
        echo $new_name
    fi
}

for file in $@; do
    real_path=$(realpath $file)
    echo "${file} -- ${real_path}"
done


3. Input Dialog Box
dialog --title "PASSWORD" --inputbox "Enter your password " 8 60 2>/dev/null
(注意最後的2>/dev/null,它的做用是將標準錯誤輸出重定向到/dev/null,若是沒有這句話,2將會被默認輸出到標準輸出上,產生奇怪的現象。
因而可知,inputbox是經過標準錯誤輸出來傳回信息的。雖然有點取巧,可是應用起來很方便。Good!)spa


4. 得到用戶密碼(若是要回顯*號的話,加上--insecure選項)
.net

#!/bin/bash                                                                                                                                                             
# a sample file to read user's password                                                                                                                                 

# password storage                                                                                                                                                     
data=$(tempfile 2>/dev/null)

#trap signals                                                                                                                                                           
trap 'rm -f $data' 0 1 2 5 15   # the 0 signal is trapped so that the temp file will be automatically removed when the script exits successfully                        

#get passwd                                                                                                                                                             
dialog --title "Password" \
    --clear \
    --passwordbox "Enter Your Password" 10 30 2>$data

ret=$?

#make decision                                                                                                                                                          
case $ret in
    0)
        echo "Password is $(cat $data)";;
    1)
        echo "Cancel pressed.";;
    255)
        [ -s $data ] && cat $data || echo "ESC pressed.";;#if size of $data is not zero, print out $data's content#!/bin/bash                                           
esac


5. 如何在腳本中創建臨時文件,而且能自動清除?
如上例,tmpfilename=$(tempfile 2>/dev/null) #將錯誤輸出重定向到/dev/null中,以避免影響結果。
trap 'rm -f $tmpfilename' 0 1 ..
那麼此時程序正常退出的時候,或者exit 1的時候,都會清除臨時文件。code


6. 打印一個棋盤
進程

#!/bin/bash                                                                                                                                                             

###print out a chess board                                                                                                                                              
for ((i=1; i<=8; i++)); do
    for ((j=1; j<=8; j++)); do
        total=$(($i+$j))
        tmp=$((total%2))
        if [ $tmp -eq 0 ]; then
            echo -e -n "\033[47m  \033[0m"
        else
            echo -e -n "\033[40m  \033[0m"
        fi
    done
    echo ""
done

(放上此實例是爲了從此寫Linux C語言和Shell混合編程作準備)ip


7. 得到當前terminal的名字
tty
ci

相關文章
相關標籤/搜索