zoukankan      html  css  js  c++  java
  • Shell编程

    1. 基础

    	1、帮助信息 wc --help
    	2、#此处是注释代码
    	3、脚本首行  #!/bin/sh
    
    $0      当前脚本的文件名  
    $n      传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。  
    $#      传递给脚本或函数的参数个数。 
    exit;    //终止脚本执行    
              转义符号
    

    2. 变量 (不要空格)

    声明: i=1
    使用: $i / ${i}
                    
    

    2.2 获取、设置环境变量

    echo $LANG
    

    2.3 Shell特殊变量

    $0      当前脚本的文件名  
    $n      传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。  
    $#      传递给脚本或函数的参数个数。  
    $*      传递给脚本或函数的所有参数。  
    $@      传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。  
    $?      上个命令的退出状态,或函数的返回值。一般情况下,大部分命令执行成功会返回 0,失败返回 1。  
    $$      当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。 
    

    3. 数组和循环

    声明: array=(element1 element2 element3 .... elementN) 		//()括起来 空格分开
    读取: #echo ${array[0]} 
    遍历: ${array[@]}  
    循环: 	(1) for data in ${array[@]}  
    			do  
    				echo ${data}  
    			done  
    		(2) 可用标准的for循环
    		(3) for shname in `ls *.sh`
    		(4) while循环
    			i=1
    			while(($i<100))
    

    4. if 分支

    4.1 示例

    // 必须注意 if中的空格
    g_SFTP_AUTH_LLD=$(cat $cfg_name|grep "^OS_AUTH_MODE=" |awk -F '=' '{print $2}')
    
        if [ ! -z "$1" ]; then 
            generate_elb_config
        fi
    
    if [ "$g_SFTP_AUTH_LLD" == "" ];then
    	g_SFTP_AUTH=$(cat $cfg_name|grep "^SFTP_AUTH_METHOD=" |awk -F '=' '{print $2}')
    else
    	g_SFTP_AUTH=$g_SFTP_AUTH_LLD
    fi
    

    4.2 条件表达式

    if [ -f  file ]    如果文件存在
    if [ !  -f  file ]    如果文件不存在
    if [ -d ...   ]    如果目录存在
    if [ -s file  ]    如果文件存在且非空 
    if [ -r file  ]    如果文件存在且可读
    if [ -w file  ]    如果文件存在且可写
    if [ -x file  ]    如果文件存在且可执行   
    if [ int1 -eq int2 ]    如果int1等于int2   
    if [ int1 -ne int2 ]    如果不等于    
    if [ int1 -ge int2 ]       如果>=
    if [ int1 -gt int2 ]       如果>
    if [ int1 -le int2 ]       如果<=
    if [ int1 -lt int2 ]       如果<
    if [ -z STRING ]         “STRING” 的长度为零则为真。
    if  [ STRING ]        “STRING” 的长度为非零 non-zero则为真。 //注, [ -n STRING ] 此种判断有误
    

    5. 定义函数

    function getBinFlag()
    {
    	isBinWithI=`lsattr -d /home/huawei/mdn2000/cmi/bin`
    	echo $binIFlag > /tmp/cmi_update_bin_flag.ini
    }
    

    5.1 待参数的函数

    funtion printName(){
        echo $1     //输出值aa
    }
    
    printName aa bb 
    printName $@    //$@--表示全部参数
    

    6. 字符串处理

    //连接字符串: 
        var3=${var1}${var2}
        catalinafilename="catalina.sh"$datetime    
    

    6.1 字符串判空

    #!/bin/sh
    
    STRING=
    if [ -z "$STRING" ]; then 
        echo "STRING is empty" 
    fi
    
    if [ -n "$STRING" ]; then 
        echo "STRING is not empty" 
    fi
    

    6.2. #()--字符串特定删除和替换

    file=/dir1/dir2/dir3/my.file.txt
    
    ${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
    ${file##*/}:删掉最后一个 /  及其左边的字符串:my.file.txt
    ${file#*.}:删掉第一个 .  及其左边的字符串:file.txt
    ${file##*.}:删掉最后一个 .  及其左边的字符串:txt
    ${file%/*}:删掉最后一个  /  及其右边的字符串:/dir1/dir2/dir3
    ${file%%/*}:删掉第一个 /  及其右边的字符串:(空值)
    ${file%.*}:删掉最后一个  .  及其右边的字符串:/dir1/dir2/dir3/my.file
    ${file%%.*}:删掉第一个  .   及其右边的字符串:/dir1/dir2/dir3/my
    ${file/dir/path}:将第一个dir 替换为path:/path1/dir2/dir3/my.file.txt
    ${file//dir/path}:将全部dir 替换为 path:/path1/path2/path3/my.file.txt
    
    //记忆方法如下
    # 是 去掉左边(键盘上#在 $ 的左边)
    %是去掉右边(键盘上% 在$ 的右边)
    单一符号是最小匹配;两个符号是最大匹配
    ${file:0:5}:提取最左边的 5 个字节:/dir1
    ${file:5:5}:提取第 5 个字节右边的连续5个字节:/dir2
    
    

    7. 获取时间

    //将当前时间赋给变量--20171214215436
    datetime=$(date +%Y%m%d%H%M%S)	
    
    获取明天的日期	date -d next-day +%Y%m%d
    获取昨天的日期	date -d last-day +%Y%m%d
    获取上个月的年和月	date -d last-month +%Y%m
    获取下个月的年和月date -d next-month +%Y%m
    获取明年的年份date -d next-year +%Y
    
    % : 印出 
    % %n : 下一行 
    %t : 跳格 
    %H : 小时(00..23) 
    %I : 小时(01..12) 
    %k : 小时(0..23) 
    %l : 小时(1..12) 
    %M : 分钟(00..59) 
    %p : 显示本地 AM 或 PM 
    %r : 直接显示时间 (12 小时制,格式为 hh:mm:ss [AP]M) 
    %s : 从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数 %S : 秒(00..61) 
    %T : 直接显示时间 (24 小时制) 
    %X : 相当于 %H:%M:%S 
    %Z : 显示时区 
    日期方面 : 
    %a : 星期几 (Sun..Sat) 
    %A : 星期几 (Sunday..Saturday) 
    %b : 月份 (Jan..Dec) 
    %B : 月份 (January..December) 
    %c : 直接显示日期和时间 
    %d : 日 (01..31) 
    %D : 直接显示日期 (mm/dd/yy) 
    %h : 同 %b 
    %j : 一年中的第几天 (001..366) 
    %m : 月份 (01..12) 
    %U : 一年中的第几周 (00..53) (以 Sunday 为一周的第一天的情形) 
    %w : 一周中的第几天 (0..6) 
    %W : 一年中的第几周 (00..53) (以 Monday 为一周的第一天的情形) 
    %x : 直接显示日期 (mm/dd/yy) 
    %y : 年份的最后两位数字 (00.99) 
    %Y : 完整年份 (0000..9999) 
    

    14、 eval命令

    test.txt内容:hello shell world!
    
    myfile="cat test.txt"
    
    (1)echo $myfile  #result:cat test.txt
    (2)eval echo $myfile  #result:hello shell world!
    
    从(2)可以知道第一次扫描进行了变量替换,第二次扫描执行了该字符串中所包含的命令
    

    15、其它命令

    15.1 shift-脚本参数位移

    //shift(shift 1) 命令每执行一次,变量的个数($#)减一(之前的$1变量被销毁,之后的$2就变成了$1),而变量值提前一位。同理,shift n后,前n位参数都会被销毁
    
    #!/bin/bash  
    echo "参数个数为:$#,其中:"  
    for i in $(seq 1 $#)  
    do  
      eval j=$$i  
      echo "第$i个参数($"$i"):$j"  
    done  
      
    shift 3  
      
    echo "执行shift 3操作后:"  
    echo "参数个数为:$#,其中:"  
    for i in $(seq 1 $#)  
    do  
      #通过eval把i变量的值($i)作为变量j的名字  
      eval j=$$i  
      echo "第$i个参数($"$i"):$j"  
    done  
    
    //结果
    参数个数为:5,其中:
    第1个参数($1):a
    第2个参数($2):b
    第3个参数($3):c
    第4个参数($4):d
    第5个参数($5):e
    执行shift 3操作后:
    参数个数为:2,其中:
    第1个参数($1):d
    第2个参数($2):e
    
  • 相关阅读:
    shell 脚本3 (输出与流程控制)
    centos 添加sudo 权限
    rz安装
    centos 安装mysql
    linux删除文件未释放
    关于字符串String的编程。
    spring mvc 学习指南二
    spring mvc 学习指南一
    《 spring mvc 》学习计划
    关于jsp的总结
  • 原文地址:https://www.cnblogs.com/Desneo/p/7212326.html
Copyright © 2011-2022 走看看