• Shell 编程基础 --语法高速入门


    简单的说shell就是一个包括若干行Shell或者Linux命令的文件。对于一次编写,多次使用的大量命令,就能够使用单独的文件保存下来,以便日后使用。通常shell脚本以.sh为后缀。第一行一定要指明系统须要哪种shell解释用户的shell程序,如:#!/bin/bash 、#!/bin/sh等。

    在这里我们使用#!/bin/bash。

    通常shell由Linux命令(外部命令)、Shell(内部命令),控制语句和凝视语句等组成,类似与windows下的批处理文件(.bat)。还须要注意的是我们须要使用 chmod  +x name.sh运行shell脚本。

    (一)变量和数组

    1. 用type推断是否是内部命令: type cmd

    2. 变量赋空值的话,直接后面+回车,而且等号两边不可以有空格。

    3. echo $a  输出a的值

    4. export A,将A设成全局变量

    显示变量的值:echo $A ,{}是用来防止混淆的。比如输出A的值后加上B字符:echo${A}B

    5. 删除变量:unset A

    6. 显示全部变量(包含本地):set ; set | grep A(显示A变量); env 显示全局变量(环境变量);初始化全局变量:export A=200。另外全局变量,依照惯例须要大写:export  LANG

    注意:全局变量可被全部的shell环境下訪问。假设父Shell进程产生了子Shell进程。则环境变量可被继承并复制

    7. 仅仅读变量,指不能被清除或又一次赋值的变量: readonly myvar

    8. 位置參量(命令行參数):位置參量是一组特殊的内置变量,通常被shell脚本用来从命令行接受參数。或者被函数用来保存传递给他的參数。相当于C语言中的argv, 当中$1表示第一个參数。$2第二个....$9 以后要用花括号把数字括起来,${10};$0 代表当前脚本的文件名称。


    測试程序:

    #!/bin/bash
    #測试位置參数和其它特殊參数
    #用法:/target.sh 參数1  參数2
    
    IFS=#
    echo shell script name is : $0
    echo the count of parameters: $#
    echo first param=$1
    echo second param=$2
    echo '$*='$*      #显示全部的位置參数串
    echo '"$*"="$*"'
    echo '$@='$@
    echo '"$@"='"$@"
    echo '$$='$$      #显示当前进程号
    echo $!
    
    

    数组定义和初始化:arr=(math Chinese English)

    数组引用:1. 引用变量:${arr[0]}  2.数组个数:${#arr[*]}  3.全部元素:${arr[*]}

    数组赋值:arr[0]=chemial

    须要注意的是shell的数组能够不连续的,这也是差别于其它语言的地方。比如:arr[0], arr[1],arr[2],arr[5]是同意的。他们的输出(假设之前赋值和下标同样的话),数组输出是0 1 2 5 。个数是4。

    (二)输入和输出


    -p 代表提示符; -t代表超时时间 。 echo $REPLY;echo -n 表示不会输出回车;-e “ ”代表转义选项

    echo颜色输出和光标定位

    33表示转义開始,格式为 [数字m,从光标開始时改变颜色

    33[30m -- 33[37m 设置前景色
    33[40m -- 33[47m 设置背景色
    33[y;xH  设置光标位置
    
    演示样例:
    echo -e "33[31mthis is a test"
    echo -e "33[10;5H33[31;46mthis is a test"
    echo -e "33[0m"
    

    (三)字符和測试语句


    算术的扩展,注意:符号两端一定要留有空格。


    表达式測试:


    字符串測试:



    检查空值

    [ “$name” = “”]

    [ ! “$name” ]

    [ “X${name}” = “X” ]

    注意:字符串測试的两边要有空格


    也能够使用(( )),可是两者是不一样的,[]仅仅能和-eq之类的符号配对,而(())仅仅能和>,<=之类的符号配对。


    另外[[ expr1 && expr2 ]]等也是能够的。(||)


    測试的简单总结:


    (四)条件和循环语句

    if语句:


    if [ $# -ne 1 ];then
    echo Usage: $0 username
        exit 1 
    fi     
    echo $1

    注意:可运行语句块,假设为空,须要使用shell提供的空命令”:”,即冒号。

    该命令不做不论什么事情,仅仅返回一个退出状态0。(shell下返回0为成功运行。返回1为失败)

    case语句:


    #!/bin/bash
    
    case $1 in 
    A) 
        echo this is A
        ;;
    B|b)
        echo this is B or b
        ;;
    *)
        echo others
        ;;
    esac

    for 语句:

    循环的运行过程:运行第一轮循环时。将list中的第一个词赋给循环变量,并把该词从list中删除。然后进入循环体,运行do和done之间的命令。

    下一次进入循环体时,则将第二个词赋给循环变量。并把该词从list中删除,依次列推。当list中的所有被移走后,循环就结束了。

    位置參量使用 $*、“$*”、$@、"$@",能够省略in list ,此时使用"$@"

    也能够使用例如以下形式:

    for((exp1;exp2;exp3))
    do
    ...
    done
    打印字符三角形:

    #!/bin/bash
    
    if [ $# -ne 1 ];then 
             echo 'usage:$0 <n> '
             exit 1
    fi
    
    if [ $1 -lt "5" -o $1 -gt "15" ];then
             echo 'usage : $0 <n> '
             echo '  where 5<=n<=15'
             exit 1
    fi
    
    for((i=0;i<$1;i++))
    do
         for((j=0;j<$[$1-$i-1];j++))
         do
             echo -n " "
         done
         
         for((j=0;j<$[2*$i+1];j++))
         do
             echo -n "*"
         done
    
         echo -ne '
    '
    done
    

    while语句:

    until 语句:


    select  列表:

    select是个无限循环,因此要记住用break命令退出循环,或用exit命令终止脚本。也能够按ctrl+c退出循环。另外select常常和case联合使用。也能够省略in list。此时使用位置參量。

    #!/bin/bash
    
    PS3="favorite pet?

    " select var in Dogs Cats Birds do case $var in Dogs) echo Dogs are my favorite pet break ;; Cats) echo Cats are my favorite pet ;; Birds) echo Birds are my favorite pet ;; *) echo none of my favorite pet ;; esac break done


    经常使用的字符串匹配:

    shift命令

    一般用于函数或者脚本程序參数的处理,特别是參数多于10以上的时候,将全部參数变量向下移动一个位置。$2变成$1,$3变成$2,依次递进,可是$0保持不变。

    有趣的样例:

    #!/bin/bash
    while [ “$1” != “” ]
    do
      echo $*
      shift
    done

    (五)捕获信号及其处理

    锁屏程序:

    #!/bin/bash
    
    trap "nice_try" 2 3 15
    TTY=`tty`
    
    nice_try()
    {
        echo -e "
    Nice try,the terminal stays locked"
    }
    stty -echo
    echo -n "Enter your pasword to lock $TTY:"
    read PASSWORD
    clear
    echo -n "Enter your password to unlocked $TTY:"
    while :
    do 
        read RESPONSE 
        if [ "$RESPONSE" = "$PASSWORD" ];then
             echo "unlocking ..."
             break
        fi
        clear
        echo "wrong password and terminal is locked ..."
        echo -n "Enter your password to unlock $TTY:"
    done 
    stty echo 
    
    stty -echo 是设置不回显的。









  • 相关阅读:
    aws AWS CloudHSM
    aws Web server log analysis
    Monitor and Respond with AWS Config
    Amazon Cognito
    Amazon GuardDuty
    使用Reflactor反编译.Net程序的经验
    Windows Server 2008 25条常见问题
    解决C#读取EXCEL中数字无法读取的方法
    关于HOOK基础知识(windows API ,C++)
    Windows下Hook API 技术(HOOK SEND)
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/7246616.html
Copyright © 2020-2023  润新知