shell学习笔记

今天莫名的有一种失落感,很多事,自己都无能为力,任由这个世界将自己随意摆布。随便记录一点Linux的知识,今天就这样吧

0、shell脚本开头的#!/bin/bash是告诉我们这个shell是在什么环境下运行的,它不是注释
   在脚本中没有写#!/bin/bash的情况下,shell仍然可以执行,这可能是系统的$SHELL环境变量指定了脚本的运行环境
1、shell脚本中的set -x是做什么的:
   set -x是shell脚本中的跟踪选项,对与调试脚本很有帮助,在脚本中加入它之后,set命令之后执行的每一条命令以及加载在命令行
   中的任何参数都会显示出来,每一行都会加上加号(+),提示它是跟踪输出的标识,在子shell中执行的shell跟踪命令会加2个加
   号(++)
2、shell脚本执行的方式
   . test.sh      sh test.sh      bash test.sh       source test.sh
3、shell中的 .  suorce   export
   当我们执行test.sh的时候,是当前终端所在的shell fork一个子shell然后执行test.sh的,执行完了再返回终端所在的shell。
   明白这点,就容易理解了,我们在test.sh设置了AA环境 变量,它只在fork出来的这个子shell中生效,子shell只能继承父shell
   的环境变量,而不能修改父shell的环境变量,所以test.sh结束后,父进程的环境就覆盖回去。所以在test.sh之后完之后,
   我们用set命令是看不了AA这个环境变量的值的。
   那有什么办法可以让脚本的环境变量在脚本执行之后仍然对当前终端存在呢?
   用sorcue 或者.(dot) 。明确告诉shell不要fork执行脚本,而是在当前的shell执行,这样环境变量就可以保存下来了。
4、shell脚本中的字符集
   export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
5、basename和dirname
   basename String [ Suffix ]  返回一个字符串参数的基本文件名称
   dirname  filename  从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)
6、sqlplus向shell传递参数   
function logSn()
{
VF_CONNECT_ORA=$1
SQLSET="set echo off\nset head off\nset pagesize 0\nset linesize 2000\nset heading off\nset trimspool on\nset feedback off\nset term off\n"
vf_log_sn=`echo -e $SQLSET"SELECT ZBG_DWD.SEQ_DWD_SQLPARSER.NEXTVAL FROM DUAL;"|sqlplus -s ${VF_CONNECT_ORA}`
echo $vf_log_sn
}
   (1)sqlplus中的set用法  \n表示换行
        set echo off -- 是否显示脚本中正在执行的SQL语句 on 显示 off 不显示
        set head off -- 是否显示列标题 on 显示 off 不显示
        set pagesize 0;     //输出每页行数,缺省为24,为了避免分页,可设定为0。
        set linesize 80;     //输出一行字符个数,缺省为80
        set trimspool on -- 是否去除重定向(spool)输出每行的拖尾空格,on 去除 off 不去除
        set feedback off -- 是否显示当前sql语句查询或修改的行数 off 不显示查询或修改的行数 
        set termout off;    //显示脚本中的命令的执行结果,缺省为on
    (2)echo中的-n  -e参数
         -n不换行输出   -e用来处理特殊字符比如\n,他会将\n看成换行符而不是简单的字符串"\n"
     (3)sqlplus中的-s参数
         sqlplus -S 表示设置无提示模式, 该模式隐藏命令的 SQL*Plus 标帜,提示和回显的显示。
7、shell中的if判断语句  []与if之间必须有空格,[]内条件与括号之间必须有空格,[]内条件中的判断符号与条件之间必须有空格,否则不能正确判断        
8、shell数组
    在Shell中,用括号来表示数组,数组元素用“空格”符号分割开。定义数组的一般形式为:
    array_name=(value1 ... valuen)
例如:
array_name=(value0 value1 value2 value3)
或者
array_name=(
value0
value1
value2
value3
)

还可以单独定义数组的各个分量:
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
可以不使用连续的下标,而且下标的范围没有限制。
读取数组

读取数组元素值的一般格式是:
   ${array_name[index]}
例如:
valuen=${array_name[2]}
举个例子:
#!/bin/sh
NAME[0]="Zara"
NAME[1]="Qadir"
NAME[2]="Mahnaz"
NAME[3]="Ayan"
NAME[4]="Daisy"
echo "First Index: ${NAME[0]}"
echo "Second Index: ${NAME[1]}"
运行脚本,输出:
$./test.sh
First Index: Zara
Second Index: Qadir
使用@ 或 * 可以获取数组中的所有元素,例如:
${array_name[*]}
${array_name[@]}
举个例子:
#!/bin/sh
NAME[0]="Zara"
NAME[1]="Qadir"
NAME[2]="Mahnaz"
NAME[3]="Ayan"
NAME[4]="Daisy"
echo "First Method: ${NAME[*]}"
echo "Second Method: ${NAME[@]}"
运行脚本,输出:
$./test.sh
First Method: Zara Qadir Mahnaz Ayan Daisy
Second Method: Zara Qadir Mahnaz Ayan Daisy
获取数组的长度

获取数组长度的方法与获取字符串长度的方法相同,例如:
纯文本复制
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}
9、 2>&1     把标准错误输出重定向到标准输出
    &>file   把标准输出和标准错误输出重定向到文件

你可能感兴趣的:(Linux)