zoukankan      html  css  js  c++  java
  • shell编程1:变量的使用与例子

    一、Shell脚本的执行通常可以采用以下几种方式:

    1):bash script-name或sh script-name(推荐使用)
    2):path/script-name 或./script-name(当前路径下执行脚本)
    3):source script-name或 . script-name #→注意”.”点号。
    4):sh<script-name或cat scripts-name|sh(同样适合bash)

    二、普通变量:

    1:环境变量:变量必须是大写

    1):配置永久性的环境变量,全局变量的配置文件:/etc/profile 、/etc/bashrc 基本上使用 /etc/profile
    2):配置用户的环境变量的配置文件,分别是:用户的主目录下的隐藏文件:~/.bash_profile 、 ~/.bash_bashrc
    3):临时设置 # export ZSY=1
    4):设置所有用户生效的目录 :/etc/profile.d/ :目录下必须是脚本否则无法使用
    5):如果写一个JAVA的脚本,要把JAVA环境变量放入脚本内,特别是定时任务执行的时候
    6):显示环境变量:
        (1):# env //* 显示的环境变量 
        (2):# set //* 显示的环境变量跟多
    7):取消环境变量 
        (1):# unset <环境变量名> //* 临时取消变量
        (2):进入文件删除变量
    

    2:环境变量的意义:

    1):UID :当前用户的UID
    2):USER :当前登录的用户
    3):HOME :当前的用户主目录
    4): _= :上一条命令的最后一个参数
    5):BASH :调用实例时使用的全路径
    6):PS1 :当前的终端
    7):PATH :命令所在路径
    

    3:局部变量:

    1):一般连续的字符串,数字,路径等可以不加任何引号,不过无引号的情况最好用双引号替代之。
    2):如果变量中使用其他变量时,则不可以使用单引号否则无法使用:如下:
        [root@centos6 ~]# a='$USER'
        [root@centos6 ~]# echo $a
        $USER
    
    3):如果变量中有空格的话,就必须使用双引号否则无法输出:如下:
        [root@centos6 ~]# a=1 2 3
        -bash: 2: command not found
        [root@centos6 ~]# a="1 2 3"
        [root@centos6 ~]# echo $a
        1 2 3
    

    4:引号的意义

    1):无引号:把内容输出出来,会将未含有空格的字符串视为一个整体输出; 如果有命令(要在反引号中的)、变量、特殊转义符解析出结果然后子在输出最终内容来,如果字符串中有空格等特殊字符则则不能完整输出,需要加双引号,一般连续的字符串,数字,路径等可以不加任何引号, 不过无引号的情况最好用双引号替代之。
    2):单引号:可以说是所见即所得:即将单引号内的所有内容都原样输出,或者描述为里面看到的是什么就会输出什么
    3):双引号:把双引号内的所有内容都输出出来;如果有命令(要在反引号中的)、变量、特殊转义符解析出结果然后子在输出最终内容来。
    4):反引号:一般用于执行命令,执行的时候命令会执行,同理可以使用 a=$(ls):结果相同
    

    5:变量定义小结:

    5.1. 普通变量:

    a=1     # 连续的数字字符串
    a="/etc/rc.local $USER"   # 解析结果后输出
    a='$USER'      # 原样输出
    

    5.2. 命令内容定义:

    a=`ls`   #反引号, 将反引号中字符当做命令输出 
    a=$(ls)
    

    5.3. 特殊变量:位置变量

    1):$n :获取当前执行的shell脚本的第n个参数值(参数值默认以空格区分,如果参数加了双引号,则将双引号的整个作为一个参数, 不管其中是否有空格,如 例3 ),n=1..9 ,当 n 为0时表示脚本的文件名,如果n大于9,用大括号括起来${10},参数以空格隔开。如下:

    例1:
        [root@centos6 ~]# echo $1 a
        a
        [root@centos6 ~]# echo $1 $2 a b
        a b
    
    例2:
        [root@centos6 ~]# cat p.sh 
        echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} ${15}
        [root@centos6 ~]# sh p.sh {a..z} 
        a b c d e f g h i j k l m n o
    
    例3:
        [root@centos6 ~]# cat p.sh 
        echo $2
        [root@centos6 ~]# sh p.sh "1 2" "3 4"
        3 4
    
        # 注意当整数超过9 时,数字要使用 “{}” 扩起来否则会出现 以下结果
        [root@centos6 ~]# cat p.sh 
        echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15
        [root@centos6 ~]# sh p.sh {a..z}
        a b c d e f g h i a0 a1 a2 a3 a4 a5
    

    2):$0 获取当前脚本本身的名字

    $1    # 获取当前传递给该shell脚本的第一个参数
    $2    # 获取当前传递给该shell脚本的第二个参数
    $#    # 获取当前传给脚本的参数个数
    $$    # 获取当前脚本运行的当前进程 PID 号
    $@    # 获取当前传给脚本的所有参数的列表
    $*    # 获取当前以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
    $?    # 是显示最后命令的退出状态,0表示没有错误,其他表示有错误
    

    3):$1 是传递给该shell脚本的第一个参数,一般系统启动文件最后都有这个,作为接收输入的命令如

    # /etc/init.d/sshd start   # 是将 start 赋值给 $1,然后脚本根据这个参数执行这个参数下的命令:如下脚本:
        [root@centos6 ~]# cat p.sh 
        case "$1" in
          start)
            echo "123" && exit 0
            ;;
          stop)
            echo "234" && exit 0
            ;;
        esac
        exit
        [root@centos6 ~]# /etp.sh start
        123
        [root@centos6 ~]# sh p.sh stop
        234
    

    4):$0 是用来取脚本本身的名字,就是你命令之后跟的内个名字,如下图的 sh a.sh 中的 a.sh

        [root@centos6 ~]# cat a.sh 
        echo $0
        [root@centos6 ~]# sh a.sh 
        a.sh
    
    例1:在启动脚本中也有 $0 ,当启动脚本的时候输入的不正确时就会出现
        [root@centos6 ~]# tail -4 /etc/init.d/sshd |head -1
        echo $"Usage: $0 {start|stop|restart|reload|force-reload|condrestart|try-restart|status}"
        [root@centos6 ~]# /etc/init.d/sshd *
        用法: /etc/init.d/sshd {start|stop|restart|reload|force-reload|condrestart|try-restart|status}
    
    例2:将文件与名字分离
        [root@centos6 etc]# cat ~/a.sh
        dirname $0 
        basename $0 
        [root@centos6 etc]# sh ~/a.sh 
        /root
        a.sh
    
        # dirname $0 取得是路径
        # bashname $0 取得是名字
    

    5):$# :获取当前传给脚本的所有参数的个数,一般用于控制参数个数,如例1.

        [root@centos6 ~]# cat a.sh 
        echo $#
        [root@centos6 ~]# sh a.sh 1 2 3 4 5 6 
        6
    
    例1:判断参数少于两个,就告诉报 脚本名加 "ARG1 ARG2" ,等于或大于两个参数时,显示钱两个参数
        [root@centos6 ~]# cat a.sh 
        #!/bin/bash
        [ $# -ne 2 ] && {
        echo "$0 ARG1 ARG2"
        exit 1
        }
        echo $1 $2
        [root@centos6 ~]# sh a.sh 
        a.sh ARG1 ARG2
        [root@centos6 ~]# sh a.sh 1 2
        1 2
    
        # 脚本中的 exit 1 指的是返回值:如下例2
    
    例2:
        [root@centos6 ~]# cat p.sh 
        echo "123456789"
        exit 28
        [root@centos6 ~]# sh p.sh 
        123456789
        [root@centos6 ~]# sh p.sh ;echo $?
        123456789
        28
    

    6):$? 命令执行的返回值,0表示没有错误,其他表示有错误

    [root@centos6 ~]# ls ; echo $?
    a.sh iptables.sh p.sh
    0
    [root@centos6 ~]# 123 ; echo $?
    -bash: 123: command not found
    127
    
    # 分号就是间隔符,表示前面和后面是两个命令的意思,执行完前一个,再执行后一个,两个命令没有任何依赖关系
    

    5.4. 返回值代表意义:

    0 :成功
    1 或 2 :权限拒接,表示权限不足
    1~125 :表示运行失败,脚本命令、系统命令错误或参数传递错误;
    126 :找到命令了,但是无法执行
    127 :命令找不到,
    大于128的 :命令执行中退出
  • 相关阅读:
    数据结构与算法分析视频教程全集
    NodeJS测试实例
    从信用卡欺诈模型看不平衡数据分类(1)数据层面:使用过采样是主流,过采样通常使用smote,或者少数使用数据复制。过采样后模型选择RF、xgboost、神经网络能够取得非常不错的效果。(2)模型层面:使用模型集成,样本不做处理,将各个模型进行特征选择、参数调优后进行集成,通常也能够取得不错的结果。(3)其他方法:偶尔可以使用异常检测技术,IF为主
    kaggle 欺诈信用卡预测——Smote+LR
    kaggle 欺诈信用卡预测——不平衡训练样本的处理方法 综合结论就是:随机森林+过采样(直接复制或者smote后,黑白比例1:3 or 1:1)效果比较好!记得在smote前一定要先做标准化!!!其实随机森林对特征是否标准化无感,但是svm和LR就非常非常关键了
    leetcode 437. Path Sum III
    cluster KMeans need preprocessing scale????
    神经网络结构设计 不一定是第一层神经元是输入维度数
    How to handle Imbalanced Classification Problems in machine learning?
    Using SMOTEBoost(过采样) and RUSBoost(使用聚类+集成学习) to deal with class imbalance
  • 原文地址:https://www.cnblogs.com/dream4567/p/6145327.html
Copyright © 2011-2022 走看看