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命令,获取用户输入,然后将结果返回给

主进程。这避免了利用GTK或者QT编程的麻烦。回想学校里的BBS客户端TERM,完全就是在控制台下跑的,既可以查看贴子,又可以回复,发帖,发邮件,真的很强大。如果在和用户的交互中

没有多媒体信息的话,利用这种方式已经足够了。另外,这种程序的移植性非常高。只要是支持标准c库、支持shell的Linux平台,都可以跑这种程序。)


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.c

#!/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!)


4. 获得用户密码(如果要回显*号的话,加上--insecure选项)

#!/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的时候,都会清除临时文件。


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混合编程做准备)


7. 获得当前terminal的名字
tty

你可能感兴趣的:(Linux Shell学习(6))