实践Shell

shell的环境配置文件

根据取得shell的流程不同而读取的环境配置文件不同分为登陆shell(login)和非登陆shell(non-login)。

登陆shell

login-shell

/etc/profile是全局登陆shell配置

~/.bash_profile~/.bash_login~/.profile,按顺序优先级根据其存在与否仅读取一个(不同系统不一样,比如:RedHat中只有~/.bash_profile,Debian下只有~/.profile文件)。他们都会读取~/.bashrc~/.bashrc会读取全局非登陆配置,比如RedHat中是/etc/bashrc,Debian中是/etc/bash.bashrc

非登录shell

仅读取~/.bashrc

基础知识

查看系统支持的shell

1
# cat /etc/shells

查看当前用户的shell

1
2
# echo $SHELL
# echo $0

修改shell,如下命令修改当前用户的shell位bash

1
# chsh -s /bin/bash

shell程序

abc.sh

1
2
#!/bin/bash
echo 1

参数

$1代表第一个参数,$2代表第二个参数,以此类推。

$0代表文件名

变量

通过variable_name=variable_value定义变量,例如:

1
2
a=123
b="hello, world!"

通过$variable_name${variable_name}引用变量,例如:

1
2
3
a="123"
b=$a
c="${b}2"

只读变量

1
2
a="123"
readonly

删除变量

1
2
a="123"
unset a

不能用于只读变量

变量类型

字符串和数值

函数

定义函数

1
2
3
4
5
[ function ] funname [()]
{
    action;
    [return int;]
}

调用函数

funname arg1 arg2…

返回值

通过return定义返回值,数值0~255,一般0表示成功,其他为失败。可以通过$?接收返回值

如果没有return语句,则返回值为最后一条语句的运行结果。

当0~255不能满足需求时,也可以通过echo来设定返回值(最后一条语句),使用${函数调用}接收返回值

命令执行结果赋值给变量

1
2
3
4
# 推荐这种方式,支持嵌套
var=$(command)
# 或
var=`command`

控制结构

1
2
3
4
5
6
7
8
9
10
11
12
13
if [ $ORACLE_HOME ]
then
	echo "ORACLE_HOME = $ORACLE_HOME"
else
	echo "ORACLE IS NOT EXISTS"
fi

if [ -z $JAVA_HOME ]
then
	echo "not exists"
else
	echo "JAVA_HOME = $JAVA_HOME"
fi

&&、||和;

shell执行方式

log-package.sh

1
2
3
4
5
6
7
8
9
10
#!/bin/sh
#package yesterday operation log
v_date=$(date -d '-1 days' +%Y-%m-%d)
v_target_error="its-core-error*$v_date*log its-core-error.log"
v_target="its-core*$v_date*log its-core-error.log its-core.log its-core-sql.log"
v_ip=`/sbin/ifconfig | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}' | sed -n '1p'`
cd /app/log/
zip  its-core-error-$v_ip-$v_date.zip $v_target_error
zip  its-core-$v_ip-$v_date.zip $v_target
exit 0

log-delete.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/sh
#package yesterday operation log
v_date=$(date -d '-1 days' +%Y-%m-%d)
v_ip=`/sbin/ifconfig | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}' | sed -n '1p'`
cd /app/log/

#if delete its-core.log ,its-core can't recreate log file
v_target_delete="its-core*$v_date*log"
rm -f $v_target_delete

#delete packaged log 11 days ago 
v_date_11=$(date -d '-11 days' +%Y-%m-%d)
rm -f its-core-$v_ip-$v_date_11.zip
rm -f its-core-error-$v_ip-$v_date_11.zip
exit 0

shell文件的绝对路径

1
BASEPATH=$(cd `dirname $0`; pwd)
1
mkdir -p  update/`date +%Y%m%d`