当前位置 博文首页 > Linux命令行和shell脚本编程宝典 Richard Blum

    Linux命令行和shell脚本编程宝典 Richard Blum

    作者:admin 时间:2021-02-03 18:17

    第一个脚本文件

    复制代码 代码如下:

    #!/bin/bash
    echo "This is my first bash code!"
    exit 0

    重定向符号和数学计算
    复制代码 代码如下:

    #!/bin/bash
    echo -n "The time and date are: "
    date
    value1=100  #等号前后不允许出现空格
    value2=$value1
    echo -n "value1="
    echo $value1
    echo -n "value2="
    echo $value2
    ls -l | sort > out.txt   #管道符号(|)和重定向输出符号>
    ls -l >> out.txt   #重定向追加输出符号>>
    echo -n  "wc<out.txt:"
    wc < out.txt  #重定向输入符号<
    echo "sort<<EOF ... EOF"
    sort << EOF  #内置输入重定向<<
    `date`
    EOF
    #数学计算
    echo -n "expr进行计算:1+5="
    expr 1+5
    echo -n "使用方括号进行计算:1+5="
    echo $[1+5]
    echo "使用bc计算器进行浮点运算"
    var1=100
    var2=200
    var3=`echo "scale=4;$var1/$var2" | bc`
    echo "$var1 / $var2 = $var3"
    var4=71
    var5=`bc<<EOF
    scale=4
    a1=($var1*$var2)
    b1=($var3*$var4)
    a1+b1
    EOF`
    echo "var5=$var5"
    exit 0

    使用test命令
    复制代码 代码如下:

    #!/bin/bash
    #使用test命令
    var1=10
    var2=100
    if [ $var1 -gt $var2 ]
    then
        echo "var1 grate var2"
    else
        echo "var2 grate var1"
    fi
    #只能比较整数
    test_user=hanxi
    if [ $USER = $test_user ]
    then
        echo "Welcome $test_user"
    fi
    str1=Hanxi
    str2=hanxi
    if [ $str1 \> $str2 ]
    then
        echo "$str1 > $str2"
    else
        echo "$str1 < $str2"
    fi
    if [ -n $str1 ]
    then
        echo "The string '$str1' is not empty"
    else
        echo "the string '$str1' is empty"
    fi
    #检查文件目录
    if [ -d $HOME ]
    then
        echo "your Home dir exists"
        cd $HOME
        ls -a
    else
        echo "there's a problem with your HOME dir"
    fi
    pwfile=/etc/shadow
    if [ -f $pwfile ]
    then
        if [ -r $pwfile ]
        then
            tail $pwfile
        else
            echo "Sorry, I'm unable to reas the $pwfile file "
        fi
    else
        echo "Sorry, the file $pwfile doesn't exist"
    fi
    if [[ $USER == h* ]]
    then
        echo "Hello $USER"
    else
        echo "Sorry, I don't know you"
    fi

    循环语句
    复制代码 代码如下:

    #!/bin/bash
    for file in /home/hanxi/*
    do
        if [ -d "$file" ]
        then
            echo "$file is a directory"
        elif [ -f "$file" ]
        then
            echo "$file is a file"
        fi
    done
    var1=10
    while [ $var1 -gt 0 ]
    do
        echo $var1
        var1=$[ $var1 - 1 ]
    done
    var1=100
    until [ $var1 -eq 0 ]
    do
        echo $var1
        var1=$[ $var1 - 25 ]
    done
    #文件数据的循环
    IFSOLD=$IFS
    IFS=$'\n'
    for entry in `cat /etc/passwd`
    do
        echo "Values in $entry -"
        IFS=:
        for value in $entry
        do
            echo " $value"
        done
    done | more
    for file in /home/hanxi/*
    do
        if [ -d "$file" ]
        then
            echo "$file is directory"
        elif
            echo "$file is a file"
        fi
    done > output.txt

    读取参数
    复制代码 代码如下:

    #!/bin/bash
    name=`basename $0`
    echo the commane entered is : $name
    c_args=$#
    echo count args:$c_args
    #取最后一个参数
    echo the last parameter is ${!#}
    echo all parameter: $*
    echo all parameter: $@
    count=1
    for param in "$@"
    do
        echo "\$@ parameter #$count = $param"
        count=$[ $count + 1 ]
    done
    #getopts
    while getopts :ab:c opt
    do
        case "$opt" in
        a) echo "Found the -a option";;
        b) echo "Found the -b option, with value $OPTARG";;
        c) echo "Found the -c option";;
        *) echo "Unknown option : $opt";;
        esac
    done
    shift $[ $OPTIND - 1 ]
    count=1
    for param in "$@"
    do
        echo "Parameter $count: $param"
        count=$[ $count + 1 ]
    done
    read -p "Please enter your age:" age
    echo age:$age
    if read -t 5 -p "Please enter your name: " name
    then
        echo "Hellp $name,welcome to my script"
    else
        echo
        echo "sorry ,too slow!"
    fi
    read -n1 -p "Do you want to continue [Y/N]?" answer
    case $answer in
    Y | y) echo
           echo " fine, continue on...";;
    N | n) echo
           echo OK,Good bye
           exit;;
    esac
    echo "This is the end of the script"
    read -s -p "Enter your password: " pass
    echo
    echo "Is your password really $pass?"
    #读取文件
    count=1
    cat for.txt | while read line
    do
        echo "Line $count: $line"
        count=$[ $count+1 ]
    done
    echo "Finished processing the file"

    重定向文件描述符
    复制代码 代码如下:

    #!/bin/bash
    #永久重定向
    exec 9>&2
    exec 2>testerror
    echo "this will in testerror">&2
    exec 2<&9
    exec 9<&0
    exec 0<testin
    count=1
    while read line
    do
        echo "Line #$count:$line"
        count=$[ $count + 1 ]
    done
    exec 0<&9
    #重定向文件描述符
    exec 3>&1
    exec 1>testout
    echo "this should store in the output file"
    echo "along with this line."
    exec 1>&3
    echo "Now things should be back to nomarl"
    exec 4<&0
    exec 0<testin
    count=1
    while read line
    do
        echo "Line #$count:$line"
        count=$[ $count + 1 ]
    done
    exec 0<&4
    read -p "Are you done now?" answer
    case $answer in
    Y|y) echo "Goodbye";;
    N|n) echo "continue...";
    esac
    #创建读写文件描述符
    exec 8<> testfile
    read line <&8
    echo "Read:$line"
    echo "This is a test line" >&8
    #关闭文件描述符
    exec 8>&-
    #列出文件描述服
    #`/usr/sbin/lsof -a -p $$`|more
    #禁止命令输出
    #2 > /dev/null
    #创建本地临时文件
    tempfile=`mktemp test.XXXXXX`
    exec 4>$tempfile
    echo "This is the first line">&3
    exec 4>&-
    #在/temp中创建临时文件
    tmpfile=`mktemp -t tmp.XXXXXX`
    echo "The temp file is located at:$tempfile"
    cat $tempfile
    rm -f $tempfile
    #创建临时文件夹
    tmpdir=`mktemp -d dir.XXXXXX`
    cd $tmpdir
    tempfile1=`mktemp temp.XXXXXX`
    ls -l
    cd ..
    #记录消息
    a=`date | tee testfile;\
    cat testfile;\
    date | tee -a testfile;\
    cat testfile`

    信号处理
    复制代码 代码如下:

    #!/bin/bash
    #信号处理
    trap "echo 'get a sign'" SIGINT SIGTERM
    trap "echo byebye" EXIT
    echo "This is a test program"
    count=1
    while [ $count -le 10 ]
    do
        echo "Loop #$count"
        sleep 10
        count=$[ $count+1 ]
    done
    echo "This is the end of the test program"
    trap - EXIT#移除捕获
    #后台牧师运行
    #./test6.sh &
    #不使用终端的情况下运行脚本
    #nohup ./test6.sh &
    #查看作业
    #jobs
    #重新启动作业
    #bg 2(作业序号)//后台
    #fg 2//前台
    #优先级
    #nice -n 10 ./test6.sh
    #renice 10 -p 25904(进程号)
    #预计时间运行at命令
    #at -f test6.sh 20:00
    #batch命令,系统平均负载低于0.8时运行,可以设定时间,比at命令更好
    #corn表格可以设定循环运行,格式:
    #min hour dayofmonth month dayofweek command
    #每个月第一天运行:
    #12 16 * * 1 command
    #每个月最后一天运行:
    #12 16 * * * if [ `date +%d =d tommorrow` = 01 ] ; then ; command

    函数的使用
    复制代码 代码如下:

    #!/bin/bash
    #函数
    #使用返回值
    function func1
    {
        read -p "Enter a value: " value
        echo $[ $value * 2 ]
    }
    result=`func1`
    echo "the new value is $result"
    #传递参数
    function func2
    {
        echo $[ $1+$2 ]
    }
    result=`func2 2 2`
    echo "the new result is $result"
    #局部变量, 递归
    function func3
    {
        if [ $1 -eq 1 ]
        then
            echo 1
        else
            local temp=$[ $1-1 ]
            local result=`func3 $temp`
            echo $[ $result*$1 ]
        fi
    }
    read -p "Enter value:" value
    result=`func3 $value`
    echo "the factorial of $value is: $result"
    #调用当前目录下到函数库
    #. ./myfuncs

    js
    下一篇:没有了