1.1. shell的数据类型
shell的数据类型是动态的数据类型。即不需要事先定义,而可以直接使用。使用过程中,能随时变换类型。比如 awk {‘print $1’} /opt/test.txt 从文本文件中打印从第一列,然后可以直接用$1进行算数比较运算。
b=grep “8-7-112-132” /opt/
b就是一个list类型。可以使用 for i in b
1.2. 其他常用命令
1.2.1. tr单个字符替换
只能用一个字符替换另一个字符,如 a=`echo $IP|tr ‘.’ ‘_’`,把IP地址中的点换成下划线。
echo $file|tr ‘ ’ ‘\n’ #将文件中所有的空格换成换行
echo $file|tr ‘[a-z] ‘[A-Z]‘ #将所有小写换成对应的大写(前面和后面的是一一对应)。
echo $file|tr -d ‘ ’ #删除文件所有的空格
1.2.2. 简单判断语句test[exp1 -gt exp2] && {sh log4.sh}
判断条件为真时,执行后面的语句,否则不执行。
test[exp1 -gt exp2] || {sh log4.sh},同理,这个语句表示,当前面的语句为假时,后面的语句才执行。
1.2.3. 表达式结果赋值语句
path=$((cd dirname $0);pwd)
dirname $a,表示将文件a的路径列出来,两个命令先后执行,用分号隔开。
想将pwd显示的结果赋值给path变量,如果直接等于pwd就不对了。还比如,
grep_ip=$(echo $odl_ip|sed ‘s/\./\\./g’)
将变量old_ip中的点,换成\.,而sed没有参数,表示只将替换的结果显示在屏幕上,并不改变文件的内容(由于前面是变量,不是文件,不能使用-i选项)
1.2.4. 命令赋值语句
赋值语句等号右边的句式太长时,需要让他们连接起来表示是一个整体,就需要用反引号括起来。
ip_list=`cat test.txt|grep “8.7.112.133”`
1.3. 算数表达式
shell中算数表示式有三种写法(注意,如果用expr方式,+ 号左右要有空格,而后面两种写法要不要空格都可以)
a=1;b=2
c=`expr $a + $b` 或 c=$(expr $a + $b)
c=$(( $a + $b))
c=$[ $a + $b ]
乘法:c = $(( $a \* $b))
除法:c=$(( $a \ $b))
幂运算:c=$(( $a ** $b))
1.4. shell中的函数
因为执行循序是从前往后,所以函数要先定义再调用。
./test.sh a b
表示执行test.sh脚本,传递的参数是a,b。且a,b是传给main函数的。在main函数中,$0,表示脚本名字,$#参数个数,2;$@原样列出参数a b;$? 函数的执行结果;
如果test.sh脚本中有change_ip方法,change_ip() old_ip new_ip,则在change_ip方法中,$@就是 old_ip new_ip了。
1.5. 获取当前文件所在目录
path=$(cd $(dirname $0);pwd)
1.6. 执行非当前用户的命令
su - oracle -c “sqlplus / as sysdba @tmp/shutdown.sql”
达到既执行Oracle用户的命令,有没有把当前用户切换到Oracle用户。
执行SQL命令时,需要先将命令放在一个文件中,用户之后再删除。
echo -e “shutdown immediate;\nexit;”>/tmp/shutdown.sql /tmp目录所有用户都有权限
1.7. shell中的单引号和爽双引号
单引号和双引号都是引用字符串,不同的是,双引号中的特殊字符:美元符号、反引号、反斜杠、大中小括号($、`、\)会保留特殊的转义作用,而单引号中所有的特殊符号都失去了特殊意义,将会原样显示。
在grep、sed、awk命令中,需要注意,grep和sed通常用双引号,而awk中用单引号。
有些命令中的格式,需要具体对待,如awk ‘{print $1}’必须用单引号,而$1符号仍未特殊意义。