Blog

  • shell基础知识

    环境变量
    截断字符串

    环境变量
    在 bash 中定义环境变量:

    myvar='This is my environment variable!'

    以上命令定义了一个名为 “myvar” 的环境变量,并包含字符串 “This is my environment variable!”。

    有几点注意:

    1.在等号 “=” 的两边没有空格;

    2.虽然在定义一个字时能够省略引号,但是当定义的环境变量值多于一个字时(包含空格或tab),引号是必须的;

    3.虽然通常能够用双引号来替代单引号,但在上例中,这样做会导致错误。因为使用单引号禁用了称为扩展的 bash 特性,其中,特别字符和字符系列由值替换。例如,”!” 字符是历史扩展字符,bash 通常将其替换为前面输入的命令。尽管这个类似于宏的功能很便利,但我们现在只想在环境变量后面加上一个简单的感叹号,而不是宏。

    环境变量的使用

    $ echo foo$myvarbar

    bash会困惑,到底扩展$m、$my、$myvar、$myvarbar…在这种情况下要用显式的花括号将他括起。

    $ echo foo${myvar}bar

    一定要记住:当环境变量没有用空白(空格或制表键)和周围文本分开时,要使用更明确的花括号形式。

    当一个环境变量被export时,他能够自动地由以后运行的任何脚本或可执行环境使用。shell脚本能够使用shell的内置环境变量支持“到达”环境变量,而C语言能够使用getenv()函数调用。如下C代码示例:

    #include <stdio.h>
    #include <stdlib.h>
    int main(void) {
        char *myenvvar=getenv("myvar");
        printf("The myvar environment variable is %s ",myenvvar);
    }

    直接执行,结果为:

    The myvar environment variable is (null)

    export myvar后,执行结果为:

    The myvar environment variable is This is my environment variable!

    使用unset myvar除去环境变量后,执行结果为:

    The myvar environment variable is (null)

    另外,也能够在一行定义并export环境变量,如:

    export myvar=abc

    截断字符串

    截断字符串是将初始字符串截断成较小的单独块,他是一般 shell 脚本每天执行的任务之一。

    这里有basename和dirname,basename返回路径的尾,dirname返回basename丢弃的“另”一个部分路径。

    $ basename /etc/nginx/sites-available/default 
    default
    $ dirname /etc/nginx/sites-available/default 
    /etc/nginx/sites-available

    命令替换

    如何创建一个包含可执行命令结果的环境变量,能够通过如下方法:

    $ MYDIR=`dirname /usr/local/share/doc/foo/foo.txt`
    $ echo $MYDIR
    /usr/local/share/doc/foo

    需要注意的是:在第一行,将要执行的命令以 反引号 括起。不是标准的单引号,而是键盘中通常位于Tab键之上的单引号。(注:单引号中的内容将会被强制显示,也就是说单引号中的命令不会被替换)
    除了反引号“外,还能够使用$()来完成同样操作

    $ MYDIR=$(dirname /usr/local/share/doc/foo/foo.txt)
    $ echo $MYDIR
    /usr/local/share/doc/foo

    使用命令替换能够将任何命令或命令管道放在“或$()之间,并将其分配给环境变量。

    像专业人员那样截断字符串

    有时候我们需要执行更高级的字符串”截断”,如下例子:

    $ MYVAR=foodforthought.jpg
    $ echo ${MYVAR##*fo}
    rthought.jpg
    $ echo ${MYVAR#*fo}
    odforthought.jpg

    第一个echo,bash取得MYVAR,找到从字符串”foodforthought.jpg” 开始处开始、且匹配通配符 “*fo” 的最长子字符串,然后将其从字符串的开始处截去。
    第二个echo,bash取得MYVAR,找到从字符串”foodforthought.jpg” 开始处开始、且匹配通配符 “*fo” 的最短子字符串,然后将其从字符串的开始处截去。

    记忆方法:当搜索最长匹配时,使用 ##(因为 ## 比 # 长)。当搜索最短匹配时,使用 #。如何记住使用”#”字符来从字符串开始部分出去?在美国键盘上,shift-4 是 “$”,他是 bash 变量扩展字符。在键盘上,紧靠 “$” 左边的是 “#”。这样,能够看到:”#” 位于 “$” 的“开始处”,因此(根据我们的记忆法),”#” 从字符串的开始处除去字符。

    同理,使用”%”来从尾部截去字符串:

    $ MYFOO="chickensoup.tar.gz"
    $ echo ${MYFOO%%.*}
    chickensoup
    $ echo ${MYFOO%.*}
    chickensoup.tar

    假如忘记了应该使用”#” 还是 “%”,则看一下键盘上的 3、4 和 5 键,然后猜出来。
    更有另一种形式的变量扩展,来选择特定子字符串。

    $ EXCLAIM=cowabunga
    $ echo ${EXCLAIM:0:3}
    cow
    $ echo ${EXCLAIM:3:7}
    abunga

    请注意命令替换$()和截断字符串${}的区别

    应用字符串截断

    下面是个简单的shell脚本,这个脚本接受一个文档作为自变量,然后打印:该文档是否是个tar文档。

    #!/bin/bash
     if [ "${1##*.}" = "tar" ]
     then
     echo This appears to be a tarball.
     else
     echo At first glance, this does not appear to be a tarball.
     fi

    看一下上例使用的”if”语句。语句中使用了一个布尔表达式。在bash中,”=”比较运算符检查字符串是否相等。在bash中,任何布尔表达式都用方括号括起。
    ($1是传给脚本的第一个命令行自变量,$2是第二个,以此类推。)

    If语句

    if [ condition ]
    then
    action
    fi

    只有当condition为真时,该语句才执行操作,否则不执行操作,并继续执行”fi”之后的语句。

    if [ condition ]
     then
     action
     elif [ condition2 ]
     then
     action2
     .
     .
     .
     elif [ condition3 ]
     then
     else
     actionx
     fi

    以上”elif”形式将连续测试每个条件,并执行符合第一个真条件的操作。假如没有条件为真,则将执行”else”操作,假如有一个条件为真,则继续执行整个”if,elif,else”语句之后的行。

    接收自变量

    看一下如下的例子:

    #! /bin/bash
    echo name of script. is $ 0
    echo first argument is $ 1
    echo second argument is $ 2
    echo seventeenth argument is $ 17
    echo number of arguments is $#

    Bash中将” $ 0 “扩展成从命令行调用的脚本名称,”$#”被扩展成传递给脚本的自变量数目。(请注意$ 和 0是连起来的)

    在Bash编程中有时候需要一次引用任何命令行自变量,针对这种用途,bash实现了变量”$@”,他被扩展成任何用空格分开的命令行参数。

    Bash编程结构

    在各种编程语言中出现的”if”语句和”for”循环等标准编程结构,Bash有自己的版本。以下几节,将介绍几种bash结构,并演示这些结构及其和其他编程语言中结构的差异。

    在C语言中,要比较特定文档是否比另一个文档新必须使用两个stat()调用和两个stat结构来进行手工比较。而在bash中,因为其内置了标准文档比 较运算符,因此,确定”/tmp/myfile 是否可读”和查看”$myvar 是否大于 4″相同容易。 看下面的例子:

    if [ -z "$myvar" ]
    then
    echo "myvar is not defined"
    fi

    上例表示假如$myvar没有定义(即$myvar为0),则echo “……….”

    bash中可使用的比较运算符如下:

    文档比较运算符
    -e filename    假如 filename存在,则为真                     [ -e /var/log/syslog ]
    -d filename    假如 filename为目录,则为真                 [ -d /tmp/mydir ]
    -f filename     假如 filename为常规文档,则为真          [ -f /usr/bin/grep ]
    -L filename    假如 filename为符号链接,则为真          [ -L /usr/bin/grep ]
    -r filename     假如 filename可读,则为真                     [ -r /var/log/syslog ]
    -w filename    假如 filename可写,则为真                    [ -w /var/mytmp.txt ]
    -x filename     假如 filename可执行,则为真                [ -L /usr/bin/grep ]
    filename1-nt filename2 假如 filename1比 filename2新,则为真

    例如 [ /tmp/install/etc/services -nt /etc/services ]
    filename1-ot filename2 假如 filename1比 filename2旧,则为真

    例如 [ /boot/bzImage -ot arch/i386/boot/bzImage ]

    字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法)

    -z string 假如 string长度为零,则为真 [ -z “$myvar” ]
    -n string 假如 string长度非零,则为真 [ -n “$myvar” ]
    string1= string2 假如 string1和 string2相同,则为真 [ “$myvar” = “one two three” ]
    string1!= string2 假如 string1和 string2不同,则为真 [ “$myvar” != “one two three” ]

    算术比较运算符

    num1-eq num2 等于 [ 3 -eq $mynum ]
    num1-ne num2 不等于 [ 3 -ne $mynum ]
    num1-lt num2 小于 [ 3 -lt $mynum ]
    num1-le num2 小于或等于 [ 3 -le $mynum ]
    num1-gt num2 大于 [ 3 -gt $mynum ]
    num1-ge num2 大于或等于 [ 3 -ge $mynum ]

    有时,有几种不同方法来进行特定比较。如下:

     if [ "$myvar" -eq 3 ]
     then
     echo "myvar equals 3"
     fi
     if [ "$myvar" = "3" ]
     then
     echo "myvar equals 3"
     fi

    上面两个比较执行相同的功能,但是第一个使用算术比较运算符,而第二个使用字符串比较运算符。

    字符串比较说明

    大多数时候,虽然能够不使用括起字符串和字符串变量的双引号,但这并不是好主意。因为假如环境变量中恰巧有一个空格或制表键,bash 将无法分辨,从而无法正常工作。这里有一个错误的比较示例:

    if [ $myvar = "foo bar oni" ]
     then
     echo "yes"
     fi

    在上例中,假如 myvar 等于 “foo”,则代码将按预想工作,不进行打印。但是,假如 myvar 等于 “foo bar oni”,则代码将因以下错误失败:
    [: too many arguments

    在这种情况下,”$myvar”(等于 “foo bar oni”)中的空格迷惑了 bash。bash 扩展 “$myvar” 之后,代码如下:
    [ foo bar ni = “foo bar oni” ]
    因为环境变量没放在双引号中,所以 bash 认为方括号中的自变量过多。能够用双引号将字符串自变量括起来消除该问题。请记住,假如养成将任何字符串自变量用双引号括起的习惯,将除去很多类似的编程错误。”foo bar oni” 比较 应该写成:

    if [ "$myvar" = "foo bar oni" ]
     then
     echo "yes"
     fi

    在调用环境变量的时候最好使用””将环境变量括起来。(注意:假如想引用环境变量的值,则不要使用单引号,因为单引号会禁用变量(和历史)扩展。如在上例中会只接受空格以前的字符)

    循环结构:”for” 先看一个简单的例子:

    #! /bin/bash
    for x in one two three four
     do
     echo number $x
     done

    输出:
    number one
    number two
    number three
    number four
    这个例子中”for x”部分定义了一个名为”$x”的新环境变量(也称为循环控制变量),他的值被依次配置为”one”、”two”、”three”和”four”。每一次 赋值之后,执行一次循环体(“do”和”done”之间的代码)。在循环体内,象其他环境变量相同,使用标准的变量扩展语法来引用循环控制变量”$x”。 还要注意,”for”循环总是接受”in”语句之后的某种类型的字列表。在这个例子中,指定了四个英语字母,但是字列表也能够引用磁盘上的文档,甚至文档通配符。再看一个使用标准shell通配符的例子:

    #! /bin/bash
     for myfile in /etc/r*
     do
     if [ -d "$myfile" ]
     then
     echo "$myfile (dir)"
     else
     echo "$myfile"
     fi
     done

    输出:

    /etc/rc.d (dir)
    /etc/resolv.conf
    /etc/resolv.conf~
    /etc/rpc

    以上代码列出在 /etc 中每个以 “r” 开头的文档。要做到这点,bash 在执行循环之前首先取得通配符 /etc/r*,然后扩展他,用字符串 /etc/rc.d /etc/resolv.conf /etc/resolv.conf~ /etc/rpc 替换。(也即循环语句被替换成for myfile in /etc/rc.d /etc/resolv.conf /etc/resolv.conf~ /etc/rpc )一旦进入循环,根据 myfile 是否为目录,”-d” 条件运算符用来执行两个不同操作。假如是目录,则将 “(dir)” 附加到输出行。
    还能够在字列表中使用多个通配符、甚至是环境变量:

    for x in /etc/r--? /var/lo* /home/drobbins/mystuff/* /tmp/${MYPATH}/*
     do
     cp $x /mnt/mydir
     done

    虽然任何通配符扩展示例使用了 绝对路径,但也能够使用相对路径,如下所示:

    for x in ../* mystuff/*
     do
     echo $x is a silly file
     done

    再看个例子:

    for x in /var/log/*
     do
     echo `basename $x` is a file living in /var/log
     done

    看看如何使用”$@”的:

    #!/usr/bin/env bash
    for thing in "$@"
     do
     echo you typed ${thing}.
     done

    输出:

    $ allargs hello there you silly
     you typed hello.
     you typed there.
     you typed you.
     you typed silly.

    Shell算术

    在学习另一类型的循环结构之前,最好先熟悉如何执行 shell 算术。能够使用 shell 结构来执行简单的整数运算。只需将特定的算术表达式用 “$((” 和 “))” 括起,bash 就能够计算表达式。这里有一些例子:

    $ echo $(( 100 / 3 ))
     33
     $ myvar="56"
     $ echo $(( $myvar + 12 ))
     68
     $ echo $(( $myvar - $myvar ))
     0 $ myvar=$(( $myvar + 1 ))
     $ echo $myvar
     57

    更多的循环结构:”while” 和 “until”
    只要特定条件为真,”while” 语句就会执行,其格式如下:

    while [ condition ]
     do
     statements
     done

    通常使用 “While” 语句来循环一定次数,比如,下例将循环 10 次:

    myvar=0
     while [ $myvar -ne 10 ]
     do
     echo $myvar
     myvar=$(( $myvar + 1 ))
     done

    能够看到,上例使用了算术表达式来使条件最终为假,并导致循环终止。
    “Until” 语句提供了和 “while” 语句相反的功能:只要特定条件为 假 ,他们就重复。下面是个和前面的 “while” 循环具备同等功能的 “until” 循环:

    myvar=0
     until [ $myvar -eq 10 ]
     do
     echo $myvar
     myvar=$(( $myvar + 1 ))
     done

    Case 语句
    Case 语句是另一种便利的条件结构。这里有一个示例片段:

    case "${x##*.}" in
     gz)
     gzunpack ${SROOT}/${x}
     ;;
     bz2)
     bz2unpack ${SROOT}/${x}
     ;;
     *)
     echo "Archive format not recognized."
     exit
     ;;
     esac

    在上例中,bash 首先扩展 “${x##*.}”。在代码中,”$x” 是文档的名称,”${x##.*}” 除去文档中最后句点后文本之外的任何文本。然后,bash 将产生的字符串和 “)” 左边列出的值做比较。在本例中,”${x##.*}” 先和 “gz” 比较,然后是 “bz2″,最后是 “*”。假如 “${x##.*}” 和这些字符串或模式中的任何一个匹配,则执行紧接 “)” 之后的行,直到 “;;” 为止,然后 bash 继续执行结束符 “esac” 之后的行。假如不匹配任何模式或字符串,则不执行任何代码行,在这个特别的代码片段中,至少要执行一个代码块,因为任何不和 “gz” 或 “bz2” 匹配的字符串都将和 “*” 模式匹配。

    函数

    在bash中也能够定义函数。函数甚至能够使用和脚本接受命令行自变量类似的方式来接受自变量。

    tarview() {
     echo -n "Displaying contents of $1 "
     if [ ${1##*.} = tar ]
     then
     echo "(uncompressed tar)"
     tar tvf $1
     elif [ ${1##*.} = gz ]
     then
     echo "(gzip-compressed tar)"
     tar tzvf $1
     elif [ ${1##*.} = bz2 ]
     then
     echo "(bzip2-compressed tar)"
     cat $1 | bzip2 -d | tar tvf -
     fi
     }
     (echo -n 不换行)

    上面定义了一个名为 “tarview” 的函数,他接收一个自变量,即某种类型的 tar 文档。在执行该函数时,他确定自变量是哪种 tar 文档类型(未压缩的、gzip 压缩的或 bzip2 压缩的),打印一行信息性消息,然后显示 tar 文档的内容。

    $ tarview shorten.tar.gz
     Displaying contents of shorten.tar.gz (gzip-compressed tar)
     drwxr-xr-x ajr/abbot 0 1999-02-27 16:17 shorten-2.3a/
     -rw-r--r-- ajr/abbot 1143 1997-09-04 04:06 shorten-2.3a/Makefile
     -rw-r--r-- ajr/abbot 1199 1996-02-04 12:24 shorten-2.3a/INSTALL
     -rw-r--r-- ajr/abbot 839 1996-05-29 00:19 shorten-2.3a/LICENSE
     ....

    名称空间

    经常需要在函数中创建环境变量。虽然有可能,但是更有一个技术细节应该了解。在大多数编译语言(如 C)中,当在函数内部创建变量时,变量被放置在单独的局部名称空间中。因此,假如在 C 中定义一个名为 myfunction 的函数,并在该函数中定义一个名为 “x” 的自变量,则任何名为 “x” 的全局变量(函数之外的变量)将不受他的印象,从而消除了负作用。
    在 C 中是这样,但在 bash 中却不是。在 bash 中,每当在函数内部创建环境变量,就将其添加到 全局名称空间。这意味着,该变量将重写函数之外的全局变量,并在函数退出之后继续存在:

    #!/usr/bin/env bash
     myvar="hello"
     myfunc() {
     myvar="one two three"
     for x in $myvar
     do
     echo $x
     done
     }
     myfunc
     echo $myvar $x

    运行此脚本时,他将输出 “one two three three”,这显示了在函数中定义的 “$myvar” 如何影响全局变量 “$myvar”,连同循环控制变量 “$x” 如何在函数退出之后继续存在(假如 “$x” 全局变量存在,也将受到影响)。
    在这个简单的例子中,很容易找到该错误,并通过使用其他变量名来改正错误。但这不是正确的方法,解决此问题的最好方法是通过使用 “local” 命令,在一开始就预防影响全局变量的可能性。当使用 “local” 在函数内部创建变量时,将把他们放在 局部名称空间中,并且不会影响任何全局变量。这里演示了如何实现上述代码,以便不重写全局变量:

    #!/usr/bin/env bash
     myvar="hello"
     myfunc() {
     local x
     local myvar="one two three"
     for x in $myvar
     do
     echo $x
     done
     }
     myfunc
     echo $myvar $x

    此函数将输出 “hello” — 不重写全局变量 “$myvar”,”$x” 在 myfunc 之外不继续存在。在函数的第一行,我们创建了以后要使用的局部变量 x,而在第二个例子 (local myvar=”one two three””) 中,我们创建了局部变量 myvar, 同时 为其赋值。在将循环控制变量定义为局部变量时,使用第一种形式很方便,因为不允许说:”for local x in $myvar”。此函数不影响任何全局变量,鼓励您用这种方式设计任何的函数。只有在明确希望要修改全局变量时,才 不应该使用 “local”。创建局部环境变量时最好使用”local”。

  • mysql存储过程学习

    一.创建存储过程
    1.基本语法:
    create procedure sp_name()
    begin
    ………
    end
    2.参数传递
    二.调用存储过程
    1.基本语法:call sp_name()
    注意:存储过程名称后面必须加括号,哪怕该存储过程没有参数传递
    三.删除存储过程
    1.基本语法:
    drop procedure sp_name//
    2.注意事项
    (1)不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程
    四.区块,条件,循环
    1.区块定义,常用
    begin
    ……
    end;
    也可以给区块起别名,如:
    lable:begin
    ………..
    end lable;
    可以用leave lable;跳出区块,执行区块以后的代码
    2.条件语句
    if 条件 then
    statement
    else
    statement
    end if;

    3.循环语句
    (1).while循环
    [label:] WHILE expression DO

    statements

    END WHILE [label] ;
    (2).loop循环
    [label:] LOOP

    statements

    END LOOP [label];

    (3).repeat until循环
    [label:] REPEAT

    statements

    UNTIL expression

    END REPEAT [label] ;

    五.其他常用命令
    1.show procedure status
    显示数据库中所有存储的存储过程基本信息,包括所属数据库,存储过程名称,创建时间等
    2.show create procedure sp_name
    显示某一个存储过程的详细信息

  • Shell中的三种变量

    系统变量,环境变量,用户变量

    其中用户变量在编程过程中使用最多,系统变量在对参数判断和命令返回值判断会使用,环境变量主要是在程序运行的时候需要设置

    1 系统变量

    Shell常用的系统变量并不多,但却十分有用,特别是在做一些参数检测的时候。下面是Shell常用的系统变量

    表示方法 描述
    $n $1 表示第一个参数,$2 表示第二个参数 …
    $# 命令行参数的个数
    $0 当前程序的名称
    $? 前一个命令或函数的返回码
    $* 以”参数1 参数2 … ” 形式保存所有参数
    $@ 以”参数1″ “参数2” … 形式保存所有参数
    $$ 本程序的(进程ID号)PID
    $! 上一个命令的PID

    2 Shell用户变量
    2.1 基础

    不管系统变量有多少,对于需求来说,总是不够的。用户变量是最常用到的变量,使用也十分简单。
    用户定义的变量必须由字母数字及下划线组成,并且变量名的第一个字符不能为数字, 与其它UNIX名字一样,变量名是大小写敏感的. 对于用户变量,用户可按如下方式赋值: BeautifierPlugin Error: Unable to handle “bash” syntax.

    name=”Winter”
    在引用变量时,需在前面加$符号,用户也可以在变量间进行相互赋值,如: BeautifierPlugin Error: Unable to handle “bash” syntax.
    name=”Winter”
    WINTER=$name
    echo “Hello $WINTER !”
    输出结果应该很清楚:Hello Winter !
    这里需要注意一点:变量和‘=‘之间不要有空格,‘=‘和赋值也不要有空格,否则shell不会认为变量被定义。掌握了基本的使用方法,你可以完全开始你的编程工作了。不过有时候需要未雨绸缪,下面介绍用户变量的一些技巧。

    2.2 使用技巧

    也可以用变量和其他字符组成新的字,这时可能需要把变量用{}括起,如: BeautifierPlugin Error: Unable to handle “bash” syntax.
    SAT=Satur
    echo Today is ${SAT}day
    输出结果是: Today is Saturday
    有时候为了避免变量名和别的字符产生混淆,你最好养成习惯把变量名用{}括起来。

    对于未赋值的变量, Shell以空值对待, 用户也可以用unset命令清除给变量赋的值.看一个例子: BeautifierPlugin Error: Unable to handle “bash” syntax.

    #!/bin/sh
    echo “a=$a” ;
    a=2
    echo “a=$a” ;
    unset a
    echo “a=$a” ;
    先猜猜结果是什么? BeautifierPlugin Error: Unable to handle “bash” syntax.
    -bash-2.05b$ ./test.sh
    a=
    a=2
    a=
    如果你懂C++,你应该知道有个变量修饰符”const”,用于避免程序一不小心对变量进行修改。在shell中,对于用户变量,你可以使用同样的修饰符”readonly”, 如果我把上面的例子修改成这样: BeautifierPlugin Error: Unable to handle “bash” syntax.
    #!/bin/sh
    echo “a=$a” ;
    #下面增加了readonly
    readonly a=2
    echo “a=$a” ;
    unset a
    echo “a=$a” ;
    其结果当然会不一样了: BeautifierPlugin Error: Unable to handle “bash” syntax.
    -bash-2.05b$ ./test.sh
    a=
    a=2
    a=2
    2.3 shell 中的数组

    shell变量中还能设置数组,但是不同的shell版本有不同数组赋值方法,而bourne shell 中不支持数组方式。因此,如果不是十分需要,还是建议你不要使用数组。若你的数据结构十分复杂,必须要使用数组,那么我建议你还是选择别的语言吧,shell不是万能的。
    shell有两种赋值方式,第一种是直接用下标赋值: BeautifierPlugin Error: Unable to handle “bash” syntax.

    name[0]=”Tom”
    name[1]=”Tomy”
    name[2]=”John”

    另一种方式对于不同的shell版本不一样。bash中赋值: BeautifierPlugin Error: Unable to handle “bash” syntax.
    #!/usr/local/bin/bash
    name=(“Tom” “Tomy” “John”)
    for i in 0 1 2
    do
    echo $i:${name[$i]} ;
    done;
    上面两种赋值方式达到的效果一样。另外,你看见访问数组元素的方法了吗?使用${name[index]}的方式。注意第一行使用的是#!/usr/local/bin/bash, 和以前有些不一样哦。其输出结果是: BeautifierPlugin Error: Unable to handle “bash” syntax.
    -bash-2.05b$ ./test.sh
    0:Tom
    1:Tomy
    2:John

     

    3 shell 环境变量

    shell 环境变量是所有shell 程序都会接受的参数。shell程序运行时,都会接收一组变量,这组变量就是环境变量。常用的环境变量:

    名称 描述
    PATH 命令搜索路径,以冒号为分隔符.注意与DOS下不同的是, 当前目录不在系统路径里
    HOME 用户home目录的路径名,是cd命令的默认参数
    COLUMNS 定义了命令编辑模式下可使用命令行的长度
    EDITOR 默认的行编辑器
    VISUAL 默认的可视编辑器
    FCEDIT 命令fc使用的编辑器
    HISTFILE 命令历史文件
    HISTSIZE 命令历史文件中最多可包含的命令条数
    HISTFILESIZE 命令历史文件中包含的最大行数
    IFS 定义SHELL使用的分隔符
    LOGNAME 用户登录名
    MAIL 指向一个需要SHELL监视其修改时间的文件.当该文件修改后, SHELL将发消息You hava mail给用户
    MAILCHECK SHELL检查MAIL文件的周期,单位是秒
    MAILPATH 功能与MAIL类似.但可以用一组文件,以冒号分隔,每个文件后可跟一个问号和一条发向用户的消息
    SHELL SHELL的路径名
    TERM 终端类型
    TMOUT SHELL自动退出的时间,单位为秒,若设为0则禁止SHELL自动退出
    PROMPT_COMMAND 指定在主命令提示符前应执行的命令
    PS1 主命令提示符
    PS2 二级命令提示符,命令执行过程中要求输入数据时用
    PS3 select的命令提示符
    PS4 调试命令提示符
    MANPATH 寻找手册页的路径,以冒号分隔
    LD_LIBRARY_PATH 寻找库的路径,以冒号分隔

    这些变量,要关注的最多的就是PATH, 其重要性不要我说了吧?

    如果你希望把你定义的变量让其他所有的shell程序都能使用,也就是定义新的环境变量。你只要使用export关键词就可以了。例如: BeautifierPlugin Error: Unable to handle “bash” syntax.

    export MY_NAME=Winter
    export PATH=/home/winter/bin:$PATH
    上面的程序中,第一行输出MY_NAME变量,第二行是在环境变量PATH中增加一个路径/home/winter/bin 。如果你希望这些设置在你登陆unix/linux都有效,你需要把他们加入到你的shell启动脚本中, 如果是使用bash BeautifierPlugin Error: Unable to handle “bash” syntax.
    ~/.bash_profile
    其他版本你看一眼就知道了,在你的home目录下,以”.”开头的文件,一般都会隐藏起来,你需要使用‘ls -al‘命令来显示。

  • 差不多先生传—胡适

    你知道中国最有名的人是谁?

    提起此人,人人皆晓,处处闻名。他姓差,名不多,是各省各县各村人氏。你一定见过他,一定听过别人谈起他。差不多先生的名字天天挂在大家的口头,因为他是中国全国人的代表。

    差不多先生的相貌和你和我都差不多。他有一双眼睛,但看的不很清楚;有两只耳朵,但听的不很分明;有鼻子和嘴,但他对于气味和口味都不很讲究。他的脑子也不小,但他的记性却不很精明,他的思想也不很细密。他常常说:“凡事只要差不多,就好了。何必太精明呢?”

    他小的时候,他妈叫他去买红糖,他买了白糖回来。他妈骂他,他摇摇头说:“红糖白糖不是差不多吗?”

    他在学堂的时候,先生问他:“直隶省的西边是哪一省?”他说是陕西。先生说:“错了。是山西,不是陕西。”他说:“陕西同山西,不是差不多吗?”

    后来他在一个钱铺里做伙计;他也会写,也会算,只是总不会精细。十字常常写成千字,千字常常写成十字。掌柜的生气了,常常骂他。他只是笑嘻嘻地赔小心道:“千字比十字只多一小撇,不是差不多吗?”

    有一天,他为了一件要紧的事,要搭火车到上海去。他从从容容地走到火车站,迟了两分钟,火车已开走了。他白瞪着眼,望着远远的火车上的煤烟,摇摇头道:“只好明天再走了,今天走同明天走,也还差不多。可是火车公司未免太认真了。八点三十分开,同八点三十二分开,不是差不多吗?”他一面说,一面慢慢地走回家,心里总不明白为什么火车不肯等他两分钟。

    有一天,他忽然得了急病,赶快叫家人去请东街的汪医生。那家人急急忙忙地跑去,一时寻不着东街的汪大夫,却把西街牛医王大夫请来了。差不多先生病在床上,知道寻错了人;但病急了,身上痛苦,心里焦急,等不得了,心里想道:“好在王大夫同汪大夫也差不多,让他试试看罢。”于是这位牛医王大夫走近床前,用医牛的法子给差不多先生治病。不上一点钟,差不多先生就一命呜呼了。

    差不多先生差不多要死的时候,一口气断断续续地说道:“活人同死人也差……差……差不多,……凡事只要……差……差……不多……就……好了,……何……何……必……太……太认真呢?”他说完了这句格言,方才绝气了。

    他死后,大家都很称赞差不多先生样样事情看得破,想得通;大家都说他一生不肯认真,不肯算账,不肯计较,真是一位有德行的人。于是大家给他取个死后的法号,叫他做圆通大师。

    他的名誉越传越远,越久越大。无数无数的人都学他的榜样。于是人人都成了一个差不多先生。——然而中国从此就成为一个懒人国了。

     

    胡适名言:要怎么收获,先那么栽

  • 战胜拖拉 (尼尔·菲奥里)书摘

    kindle touch 书摘

    当待处理事项清单上,次重要的事情取代了最重要的事情时,你倒是可以安慰一下自己,因为你知道自己毕竟是在做一点杂事。然而你只是在完成一些次重要的任务,它们带来的只是部分的满足感。如果不采取一种策略,让自己在启动最重要项目中找到完全的满足感,你将会继续拖拉。

    你把一项简单任务的完成情况变成了对自我价值的考验、是否能让人满意的考验,或将是成功并幸福还是失败并痛苦的考验。在大部分情况下,你都是那位把做事与考验价值相混淆的人,而在考验价值的过程中,一次可能的错误就会让你感觉就像是世界末日的来临。如果早期教育让你相信你的自我价值是由自己的业绩所决定的,那么你肯定会将注意力集中于防止失败、摔倒的自我保护方面,而不仅仅限于做事本身。现在关闭刚才的场景,深呼吸,然后看下面一个场景。

    第一种:”我不得不做”的消极想法整天重复”我不得不做”(意思是说”我不得不去做,但我不想做”)这样的话,会给你一种犹豫感和受害感(”我不得不做,但如果我有权力的话,我就不会去做了”),会让拖拉行为变得合理化。只要认清了这样的自我陈述及其背后的受害态度,你就会希望马上用一种选择性的陈述和一种自我增强能力的态度去挑战它。

    第二种:”我必须完成”的消极想法告诉自己”我必须完成”,让自己把注意力集中在未来某个时刻出现的情景当中去,却从不告诉自己应该从哪里开始着手。”完成”是一个看不清的遥远之地,从你现在可能的技能、自信和观察来看,还有一断长长的距离。这样的专注会让任务变得更加地无从下手,甚至是不可能完成。它需要用一种从现在开始的坚定决心来进行挑战和取代。

    用”我什么时候开始”取代”我必须完成””我什么时候开始?”是高效者的一条警句。它始终表现出对任务完成情况的焦虑和对现在能处理事务的明确专注。这句话起着一个反馈器的作用,它能把任何摇摆不定的注意力推回到项目的起始之处。而当你不能从现在开始的时候,”我下一次能从什么时候开始?”这样的问法,能让你准备好向可见的未来径直而轻松地出发,让你清楚地看到,你将在什么时候、什么地点、以什么事情作为开始。

    第三种:”这个项目大且重要”的消极想法想着一个项目多么的大且重要,会让无从下手的感觉更加强烈。你实际上所说的是:”我不知道我怎样才能应付这样巨大的一个任务。这个任务很重要,它必须给每一个人留下深刻的印象。这是我人生中的一次难得的机会。”项目对你而言越是巨大,越是无从下手,你拖拉的可能性也就越大。当你采取所有相关步骤,想象着关于这一重要项目所有紧要的事情,从而让自己感到无所适从的时候,动力与好奇心会被焦虑所取代。

    用”我可以走出一小步”取代”这个项目大且重要”每当你开始在一个大型的、向你压顶而来的项目面前感到无所适从的时候,试着提醒自己:”我可以走出一小步。一小步,一份简单又粗糙的草稿、一个不完美的框架、一声轻轻的问候。现在,我所需要做的就是这些。”你不可能一下子就建起一座大厦。你现在能够做的所有的事情,只是给地基浇铸混凝土、钉钉子、筑墙—-一次一小步。你不可能马上就写出一本完整的书;你只能一次写一个章节,几页纸。一个简单而微小的步骤是你所知道的你能在现在完成的全部事情。与巨大的事业相比较,这个可操作的步骤会给你留下时间,在一系列小步骤的间隙中,学习、休息、休整。每一个步骤中,你都有时间来欣赏自己的成就,对你前进的方向获得新的认识,并再次在你的长远目标上下定决心。

    第四种:”我必须做到十全十美”的消极想法”我必须做到十全十美,如果犯了错,我不能忍受。”这样跟自己对话,将会大大地增加需要用拖拉作为缓冲来抵御失败与责备之痛的机会。这样的话同样意味着,你的自我对话是围绕着一点而展开的,即判定前进途中任何一步与你认为应该如何的状态相比,都是不够显着的。如果你要求自己有一个完美的展示,完成一个不被批评的项目,做一份大家完全喜欢的饭菜,或者拥有一个完美的家庭,那么你注定会失败,并且不可避免地引来自我批评。你越是想完美,越是自责,着手开始一个项目时就越觉得困难,因为你已经知道它不可能会是足够完美的。始终想着完美的状态,会让你怯于见到你的真实产品的样子。始终想着完美的状态将会让你无法用一个有利于行动的计划为失败做好准备,并且在发展的过程中,当面临一个难题时,还会增加你放弃的可能性。矛盾的焦点是,做一个完美主义者,因错误而责备自己,反而让失败更容易发生,也更为严重。用”我完全是一个凡人”取代”我必须做到十全十美”以接受(但不是顺从)自己的人性极限取代对完美工作的要求。接受所谓的错误(实际上是一种反馈)是正常学习过程中的一个重要部分。在做实在的、不完美的工作,而不是空想完美的、完成了的工作时,你会不可避免地面临风险,这个时候,你需要用一种自我同情,而不是自我批评的态度,去支持自己勇敢地努力。当你认识到作为一个新手,你必须踏出笨拙的第一步才能保证成为一位大师时,你会希望对自己特别地温柔。当你学会期待和接受项目中早期步骤出现的缺憾时,你会让高效者的坚持成为自身的一部分,也会为从困境中得以恢复而做出更好的准备,因为你有一张用同情织成的安全网。

    第五种:”我没时间玩”的消极想法像”整个周末我都得工作”、”对不起,我不能跟你们一起玩,我得把这个项目做完”、”今天晚上很忙,马上就到最后期限了”……这些语句会让你对工作产生厌恶,这种情绪来自于长时间的剥夺感和孤立感。一次次重复这些语句,将会让你产生这样的感觉:生活中充满了义务和要求,使得一次次自己错过了别人在生活中所享受的美好的东西。

    用”我必须花时间玩”取代”我没时间玩”对于锻炼、与朋友进餐、一天中频繁的休息以及一年中频繁的休假,如果能保证花在上面的时间固定,那么就会增强你的自我价值感和自尊心,而这也正是消解拖拉需要的核心所在。知道自己在可见的未来有个期盼–对休闲、与朋友一起玩的坚定承诺–会让你减轻对困难工作的畏惧。运用以上五种积极的自我陈述,会减轻与工作联系在一起的痛苦,同时会让你有更多的机会发现工作本身就可以是有益的。另外,你的工作的质量也会增加自己无忧休闲的快乐,那是你问心无愧地赢得的。而不断地对微小步骤施以回报,也会增加持续进步的可能性。

    “选择从一小步开始,我知道有大量的时间可以用来休闲。”幸运的是,要改变行为,你不必等到完全停止消极的想法和自我陈述的时候。相反,你可以运用对旧有模式的认识,警醒自己选择一条更有效力的道路。你就像是铁轨上的扳道工:一辆高速行进的火车头碾过触发点,给你一个信号,把引擎转移到另一条轨道上去。

    因为紧张而裹足不前。

    这些长时间的拖拉者:看到自己总是处于工作的状态。他们让自己忙于产出具体的工作成果。

    如果在朋友身上或在休闲活动中花费了时间,就会感到内心愧疚。因为他们的工作效率并不是很高,觉得花任何时间去进行休闲都是有罪的,所以在休闲活动中,他们也都会表现为心不在焉,满怀愧疚,而不是充满激情、高质量地、无忧无虑地玩乐。

    一心一意地工作与一心一意地休闲,在享受人生方面是密不可分的。他们现在已经是在享受生活–而不是在等到工作完成之后再去享受。

    你必须让工作周期变得更短(痛苦更少),让回报更频繁、更及时(更加快乐)–将短周期的工作、休息与回报结合起来。

    虽然恐惧与拖拉往往会让人上瘾,因为它们以减轻紧张感而给你回报,但是,事实上它们是可以被消解掉的。

    1、坚持要知道从哪里着手开始才是正确的。在寻找正确出发点的过程中,犹豫不决,拖拖拉拉,让你无法从事项目中余下的部分。同时存在几个出发点的可能性不复存在,而你又担心你所选择的那个出发点是否会带来灾难性的严重后果。你已经让自己陷于正确-错误–这第一次到底是对是错的思考中。从这样的角度来看,似乎每一个出发点都已经是坚如盘石,决定着接下来的步骤和多米诺骨牌的命运,让你在错误的方向上越走越远。

    2、不在项目进行过程中给自己设定时间学习、在每个步骤中建立信并向别人寻求帮助。你的二维思维会给自己施加压力,让自己从现在起,一开始就要能够胜任。你期望自己在一开始的时候就感到自信十足,而不是允许自己在前进的道路上有时间停下来学习。

    3、自责于仍处于开始状态的现实,并且告诉自己:”我应该已经完成了。”在被拿去和想象中的理想状态做比较的过程中,每一个成就都会被削弱。在与目标的比较中,出发点和不断探索的道路也就几乎没有了合理性。你对自己目前的缺憾和挣扎缺少宽容与同情。这种责备式的比较,让你在出发点的消极自我映像与终结点的理想状态之间,反复折腾。当你尝试着解决如何把自己从目前状态转变到理想状态的问题时,你就会体验到那种无法抗拒的焦虑。

    真正的自信是,知道自己不管是平静还是紧张,不管是成功还是失败,你都会做到最好,如果有必要,还随时会爬起来继续前进,继续尝试。真正的自信是要能够说这样的话:”我为最坏的情况做好了准备,现在,我可以专心致志地从事工作了。

    拖拉意识到的是,拖拉需要耗费体力,直面对完成的恐惧同样需要耗费体力。事实上,没有任何一种方式可以用来逃避某种形式的劳作。那为什么不去从事那些即将收获最大化效益的劳作呢?劳拉不顾疼痛继续跑马拉松的行为,让她在完成研究的过程中运用即时习惯策略的其他工具时,做起来更为容易了。她辨清了自己通过努力行将抵达终点,即将受到别人评判时,那种想要放弃的倾向。通过把这种倾向与她的消极的自我陈述相联系,劳拉得以用高效者的积极对话方式来挑战它,并把自己的努力引向项目的完成。对于完成项目所涉及的那些步骤,劳拉所参加的马拉松比赛起到了一个很好的比喻作用。

    如果你是一个完美主义者,事情更会是这样,因为你害怕犯错,总是在与专家核对,总是要列出一长串的事项想要考虑,从而使自己无法独立地全身心地投入。为了克服这种倾向,请把任何向老板寻求帮助、跑图书馆寻找别的解决方案或者做进一步准备的倾向,都标为拖拉。”从事一个项目”或许需要被严格地定义为你自己努力直到完成,而不是不停地做准备或从别人身上收集建议。对于任何进一步研究的理由,当你寻求反馈,问自己究竟完成了哪些事情的时候,其是否合理就能够清楚地判定。像劳拉那样提醒自己,逃避做事的道路是没有的:进一步准备需要做的事情;完成整个项目需要做的事情;如果你费尽心思试图通过拖拉来逃避同样需要做的事情,那么为什么不选择再朝前迈进一步呢?

    在一件只花9分钟的事情上,我却拖了好几个月!

    高效者也需要制度我已经有过一些”现实”的经历,作为101空降师的一名中尉、一个生产线的主管、一家石油公司的经济师,当我开始学习咨询与心理学研究生课程的时候,我的早期经历教会我,如何在压力下工作,并在别人要求的时间内把工作做完。它还教会我,通过选择,我可以轻松而有效地工作。当我回到学校,看到我的心理学同学们在一些论文上苦苦拖拉上好几天的时候,我有些不解,因为我的论文花了不到2个小时的时间就完成了。

    集中于开始。 你的任务是按时到达出发点的位置。这样做的好处是,你的”待处理事项”列表中只需要有一件最重要的事项–“下次我可以什么时候开始?”把所有有关完成的思想都去掉,换成对可以何时、何地、以何事开始的考虑。

    不要以读完一本书、写完一封信、报完所得税或者连续工作4个小时为目标,而要以30分钟的高质量专注工作为目标。

    在项目上仅仅投入30分钟的工作,足以维持一种惯性,免去需要在第二天克服惰性的额外负担。

    运用最频繁的、经常发生的行为(通常是你最喜欢的活动),作为增加、强化你想加强的任何一种积极习惯的激励工具。例如,如果你在放弃一个项目之后看电视,那么放弃就会变成一个更强的消极习惯,因为后面有一种回报跟着它。相反,如果在看电视、吃饭或睡觉之前做的是平衡账簿、写作或粉刷工作,那么一个良好的习惯就形成了。当这些成绩与快乐之间产生联想时,你会更加轻松、更加频繁地劳作于其中。

    创造性的心理状态通过减轻由繁重的工作而带来的痛苦,可以很大程度地避免那些导致你用拖拉来进行自慰的挣扎与恐惧。

    不用等到你感觉良好,或者拥有”合适的情绪”时再去工作,你可以运用这种技巧,从而让”尽管做”成为一种切实的可能性,而不是建议战胜拖拉的酸腐说辞。

    周期性(比如是每星期一次)地从事20分钟放松练习,对于唤起你积极的感受和精神都是有用的,它们都是由更深层次、更长时间的放松状态所激发出来的。

    (1) 每一次呼吸,我都变得更加机敏、好奇且兴致勃勃。就在时钟走过数秒之后,我将用意志和决心穿越不安与忧虑。 (2) 当我发掘到内心深处的智慧和许多不同的解决办法,我变得越来越机敏,并随时准备开始。 (3) 终于实现完全的机敏,在创新功能的支持下,整个大脑以天才般的水平运行,愿意并渴望开始。

    伟大的工作,是用恒心而非蛮干来完成的。

    对于你身上所发生事情的成因,你或许没有责任,但对于要做些什么去纠正它,你是有责任的。”这句给人力量的话包含了一个许多人没有领会到的重要概念:别去担忧问题的初始原因,把你的精力引向自己可以发挥最大作用的地方–提出解决问题的办法。迅速纠正错误的能力与对解决方案负责任的程度有关,但首先你必须保证不再发牢骚–“为什么这件事发生在我的身上?为什么我总是那个分到棘手任务的人?为什么我不能学会把事情做正确?为什么我必须要容忍这么多的笨蛋呢?”这是”应该”与”不应该”的另外一种形式,让你推迟承认环境中的现实(不管多么的让人不愉快),推迟对它的纠正,推迟减轻困难并避免它在未来出现的时间。

    没有什么比永久性地悬在一项未完成的项目中更让人疲惫的了。

    为避免因陷入拖拉循环而受挫折,你必须放弃那些根本实现不了的目标和没有多大热情的愿望。

    成功的高效者们保守得最严的一个秘密是:他们有能力放弃那些在近期内不可能实现或开始着手去实现的目标。为设定现实的目标,你必须是心甘情愿且全心全意地投入到实现目标的工作过程中,如果你找不出时间和动力从现在就开始着手为那个目标而工作,那么就去放弃它,要不然它会一直困扰着你,让你感觉自己像是一个拖拉者–似乎你未能完成某些重要的事情,而你曾经对自己承诺过要去完成的。

    成功的高效者们保守得最严的一个秘密是:他们有能力放弃那些在近期内不可能实现或开始着手去实现的目标。为设定现实的目标,你必须是心甘情愿且全心全意地投入到实现目标的工作过程中,如果你找不出时间和动力从现在就开始着手为那个目标而工作,那么就去放弃它,要不然它会一直困扰着你,让你感觉自己像是一个拖拉者–似乎你未能完成某些重要的事情,而你曾经对自己承诺过要去完成的。

    你是目标的主人;不要让不现实的目标成为自我批评、并错误地把自己当成一个拖拉者的原因。作为一位高效者,你知道哪些目标需要去全心全意地追求,哪些目标需要不屑一顾地放弃。

    清拖拉中的付出。丢开那种靠拖拉就能避免付出的幻想。人生中没有哪一条道路不需要人的付出。付出与努力逃避付出都是有代价的,认清这一点后,准备好全力投入到某一个目标的实现当中。你的选择不是付出还是不付出,而是哪种类型的付出;即便是因拖拉而愧疚,也需要你去付出。当你投入于某个目标,你其实是在投入于一种能不断带来回报的付出。当你拖拉的时候,你是在选择一种自我惩罚式的付出。

    多数拖拉问题之根本的三大问题:感觉像受害者;茫然不知所措;害怕失败。成功的领袖与管理者,以诱导承诺而非顺从的措辞来引导沟通,专注于可操作的客体而非无从实现的预期,并赞扬在正确的方向上取得的进展而非只用批评错误来处理这些问题。他们在管理方式上形成了一种朝向目标的拉力,专注于每一小步的开始,并为员工提供了充足的安全与回报。

  • 招商银行信用卡申请成功了

    5月8日办信用卡的人来公司办卡,5月17日显示收到我的资料,5月22核发

    对信用卡的境外支付也比较担心,下面搜到一个使用的技巧,为安全使用信用卡做保障。

    1、信用卡网站(网上银行大众版)中设置的网上支付状态和网上支付限制额度只对“一网通”网上支付和“VISA验证”支付服务有限制,对使用网上银行专业版后用信用卡网上支付(需要提供信用卡的有效期和查询密码)和对境外不支持“VISA验证”支付商户支付(需要提供信用卡卡号、姓名、信用卡的有效日期、信用卡背面的安全号码的后3位就可以消费,不需要像“VISA验证”支付那样再验证商户合法性和用户的查询密码)无效(推荐做法:将网上银行大众版中设置的网上支付关闭,并将网上支付限制额度设为0,信用卡支付使用网上银行专业版)。
    2、网上银行专业版中的信用卡额度调整中设的限额(如我设了限额500元,则国外网上支付和刷卡消费时限额为60美元)对专业版信用卡网上支付和境外不支持“VISA验证”支付商户使用时都有效,对境内外直接刷卡消费也有效。
    3、在国外网站使用VISA支付还是相对比较安全的,对于境外非VISA支付,还需要校验信用卡背面的安全号码的后3位(推荐做法:为了保护安全码,可以将自己信用卡的安全码后3位记住后用刀片刮了并尽量不使用安全码,不知这样做会不会被特约商户拒刷)。一般来说,国外网站会要求货物的邮寄地址和信用卡的账单地址相同,如果发生邮寄地址、收包裹的人和信用卡执卡人姓名不同的情况,你是有权向银行索要回钱的(不知国内银行是否能这样做)。(推荐做法:为了避免使用安全码,不建议在国内网站购物直接使用信用卡支付,可以选择用网上银行专业版支付并选择用信用卡支付,不需要使用安全码,需要使用查询码)。
    4、在填写支付信息的时候,如果你的浏览器的状态栏有个小锁出现,这就表示信息是被加密的,理论上应该不用担心信息在传输过程中的安全问题(如中木马不能保证信息输入的安全性问题)。
    5、为了安全起见尽量避免身份证号信息泄露,因为很多功能都需要用到身份证号。