shell脚本学习笔记

       平时接触了主机,有空就系统整本书的看下。总感觉这种脚本没有java或c语言那样很规范的语法,它的实现感觉有些随意,通过一些写法的技巧轻易的解决事情,随意自然轻巧,也许这就是linux这种开源东西的优势吧。

 

ubuntu 中文乱码
如果使用的是 PuTTY,可以通过修改 font, character set 设置来解决。
Window -> Appearance -> Font settings 选择宋体或新宋体:
Window -> Translation -> Character set translation on received data 选择 UTF-8:

--ubuntu
--设置root密码
sudo passwd root
sudo /etc/init.d/ssh star

 

startx--启动图形界面
cal 2002--查看2002年日历
man date/info date --查询date指令的使用
who --查看当前用户
netstate-a --查看当前网络情况
ps -aux --查看后台执行的程序
shutdown/reboot --关机
reboot -f 强制重启

--改变一个文件的群组
chgrp 群组名 文件
chown -R tomcat /home/tomcat/


--8080端口映射到80端口
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8000

--设置ip地址
 10.8.6.247
cat /etc/sysconfig/network-scripts/ifcfg-eth0
--列子
DEVICE=eth0
BOOTPROTO=static
HWADDR=E4:1F:13:38:5E:60
IPADDR=10.26.88.205
NETMASK=255.255.255.192
GATEWAY=10.26.88.254
ONBOOT=yes
TYPE=Ethernet

--重启ip设置
/etc/init.d/network restart

--查看这个目录下的文件大小
du -m /home/tomcat


--修改linux启动默认
/etc/inittab 的id:5:initdefault:
init[012356]
0: 关机
1:单用户
2:多用户网络没有网络服务
3:多用户网络有网络服务
5:图形界面
6:系统重启

 

--切换账户 报open to many
su: /bin/bash: Too many open files in system
vi /etc/sysctl.conf
fs.file-max = 6553600
最后退出输入回车

--vi使用
复制:yy
粘贴:p

删除:dd


--服务器间的数据copy
scp jdk-6u16-linux-x64.bin [email protected]:/usr

--代码更新
cp -r src/* target/xxt


修改文件名:
mv 原来文件名,修改后的文件名

--启动ftp
service vsftpd start
service sshd start
chkconfig sshd on

ftp ip
get 文件名   --下载文件
delete 文件名 --删除文件
bye   --退出


linux jdk设置
chmod +x jdk-6u17-linux-i586.bin

cat /etc/profile
export JAVA_HOME=/usr/jdk1.6.0_17
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export LANG='zh_CN'


/usr/java
--创建账户
useradd  账户名
useradd -G dba vas
passwd 账户名

usermod 修改用户
passwd root

killall 进程名


--查看字符集
locale


--创建文件
touch filename

--创建文件夹
mkdir filename

--查看ip,mac地址
/sbin/ifconfig


--修改时间
date -s 2011-01-25
date -s 02:23:30
clock -w
clock -r
clock -hwtosys

 

--挂载文件
mount
--挂载光盘
mount /mnt/cdrom
unmount

--查看分区
fdisk -l
window linux 安装系统删除linux
fdisk /mbr

--查看当前运行的shell
env
--切换shell
chsh -s /bin/csh

--追踪路由命令
tracert www.sina.com

--安装tar.gz文件
tar -zxvf qbittorrent-2.4.4.tar.gz

tar -zxvf apache-tomcat-5.5.33.tar.gz

 

--rpm 安装
--安装软件:
rpm -ivh  MySQL-clinet-community-5.1.52-1.rhel3.i386.rpm  MySQL-server-community-5.1.52-1.rhel3.i386.rpm
--查询是否有该软件
rpm -qa|grep name
rpm -qa name

--卸载软件 rpm -e name
--强制卸载 rpm -e --nodeps name

--任务调度
--启动任务调度 一般不需要手动调用下面
/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重新载入配置

--任务编辑 crontab -e
--任务删除 crontab -r
--任务列表 crontab -l


--网络命令

 netstat -anp
--显示本机到远程主机的历程名称 tracerout
netstat -anp | grep '8000' | wc -l

--建立超链接
ln -s 源 目标

--字符查找
grep -n  "java"   /home/tomcat/*
grep 参数:
-i 大小写
-v 显示不匹配的行

 

--宏定义
alias l='ll -t'

查看物理CPU的个数
cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l
 
查看逻辑CPU的个数
cat /proc/cpuinfo |grep "processor"|wc -l
 
查看CPU是几核
cat /proc/cpuinfo |grep "cores"|uniq

--cpu信息
more /proc/cpuinfo
--位数
getconf LONG_BIT


--wc 统计文本数
行数(line),字数(word),字符数(character)


--安装ssh
sudo apt-get install openssh-server

负载里面的 1分钟、5分钟、15分钟的数字 ,1分钟 当前的数字 除以 核数>=5 就表示 服务器需要升级 或者优化

释放内存:echo 3 >/proc/sys/vm/drop_caches

 

--shell脚本文件的常用命令
幻行,使用该sh
#!/bin/sh

#不可变变量
readonly 变量名

#删除变量,函数
unset 变量名

#数组
a[0]='a0'
a[1]='a1'
a[2]='a2'
#访问索引1
echo "${a[1]}"
#访问数组中的所有变量
echo "${a[*]}"
echo "${a[@]}"


#变量置换

#缺省值置换 param为空或未赋值,word取代param,param不变
${param:-word}

#缺省值赋值 param为空或未赋值,word赋值param
${param:=word}

#空值错误 如果为空,错误提示信息  
${param:? 'msg'}

#有值置换
${parame:+msg}

#命令置换 命令获取的数据存放到变量中
DATE=`date`

#算式置换 完成简单的运算
echo $(( 5*2 ))

 

#输出命令的路径
type cmd

 

#睡眠时间 单位:秒
sleep 2

#find
cd ~ && find .. -name memcached -print 2>/dev/null
-name 文件名 可用正则

 

-type 类型
   f 通常文件
   d 目录
   b 块设备
   c 字符设备
   l 符号链接
   p 命名管道
-mtime 修改时间
-atime 访问时间
-ctime 改变时间
  +n 大于n天 -n 小于n天 n 等于n天
-size 磁盘块
-exec 后面执行命令 得到的查询结果{}

cd ~ && find /home/zyl/tmp -name a.txt 2>/dev/null -print -exec rm -rf {} \;
find . ! \( -name memcached -o -type f \) -print 2>/dev/null

find   ./   -size   +100000k   -print

--xargs
数据传递给后面执行命令充当参数

--expr 简单的整数运算
expr 1 + 2  #需要有空格 不然当成一个字符串
--expr 使用正则,返回匹配的字符数
abc=12345abc
expr $abc : '[0-9]*'
$(( 1+2 ))

--bc 计算器
bc
obase :输出进制
ibase :输入进制
 

printf
s:字符串
c:字符
d:十进制
x:十六进制
o:八进制
e:指数
f:固定浮点数
g:紧密浮点数
默认右对齐,-左对齐

printf "%16s\t%16s\n" "name"  "user name"
printf "%16s\t%16s\n" "str1"  "ranga"
printf "%16s\t%16s\n" "str2"  "zhang"
{ date; uptime; who; } > a.txt

 

--同时在控制台和文件中输入
cmd | tee a.txt

ls << aa
-l
aa

--用户输入
read name
echo $name
--表示不输出输入的字符串
stty -echo
read name
stty echo #输出输入的字符串

--文件描述符 重定向
date 1>a.txt 2>&1
0:stdin
1:stout
2:sterr

>dev/null 表示丢弃输入文件
--定向到同一个文件
 1>a.txt 2>&1

--关闭定向
 6>-

--查看文件信息
file fileName

--超级链接
硬链接 ln src target
符号链接 ln -s src target


-- 前台进程变成后台进程,进程 ctrl+z 后输入bg变成后台运行。bg %1
-- 后台进程变成前台进程, fg %1

--一些不好后台运行的,关闭终端时候自动结束可以用 nohup 运行
nohup ls &
输出日志到 nohup.out


[tomcat@wxxyweb ~]$ ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
tomcat    9545  9379  0 May29 pts/1    00:00:00 -bash
tomcat    9597  9545  0 00:07 pts/1    00:00:00 ps -f
uid:运行程序的账户
pid:进程标识符
ppid:parent pid
c:cpu占有率
unlabeled:精确值,优先级
STIME:启动时间
cmd  执行的命令

--shell 版本
echo $BASH_VERSION

echo $PWD;--路径
echo $UID;--用户编号
echo $SHLVL;--自动加1
echo $REPLY;--读到输入的第一行
echo $RANDOM;--0到32767的随机数
echo $SECONDS;--shell 启动的花费的时间
echo $IFS;  --分离,不清楚
echo $PATH; --path路径
echo $HOME; --home

if [ "$a" = "start" ];then
  echo "Start"
elif [ "$a" = "start2" ];then 
  echo "start2"
else
  echo "no start"
fi


--判断文件
if [ -f /home/zyl/zyl.sh ];then

-b file 存在并且是块文件
-c file 存在并且是字符文件
-d path 存在并且是一个目录
-e path 文件或目录
-f file 存在并且是正规文件
-g path 存在文件夹并且设置了sgid
-h file 存在并且是链接
-k path 文件或目录存在,并且设置了粘泻位
-p file 存在并且是命名管道
-r path 文件或目录可读
-s file 文件大小大于0
-u path 设置了suid
-w path 可写
-x path 可执行
-o path 当前进程有效用户id所拥有

--字符判断 = 两边需要有空格
if [ "$a" = "$b" ];then   
-z str  长度为0
-n str  长度不0
str1=str2
str1!=str2

--数字比较
if [ $a -eq $b ];then
int1 -eq int2  等于
int1 -nq int2  不等于
int1 -lt int2  小于
int1 -le int2  小于等于
int1 -gt int2  大于
int1 -ge int2  大于等于

--判断上一个命令是否执行成功,临时变量写入 $?
pwdd
if [ $? -eq 0 ];then

复合比较
!expr
expr1 && expr2
expr1 || expr2
--列子
! [ $a -eq $b ]
[ ! $a -eq $b ]
# -a = and
# -o = or
[ -d "$a" -a "$a" = "$b" ]
[ -d "$a" ] && [ "$a" = "$b" ]

--case语法
case "$a" in
    "a") echo "aa";;
    "b") echo "bb";;
    *a*) echo "*a*";;
    *) echo "default";;
esac


--while 语法
x=0
while [ $x -lt 10 ]
do
echo $x
x=`expr $x + 1`  #`符号是在~按键上
done

输入重定向
while read LINE
do
case $LINE in
*root*) echo "root $LINE";;
esac
done < /etc/passwd

while : #无限循环

break,countinue

--until 直到 true 结束 和while相反
x=0
until [ $x -gt 10 ]
do
echo $x
x=`expr $x + 1`
done

--for 语法
for p in $*
do
echo "$i=$p"
i=`expr $i + 1`
done

for i in /home/tomcat/*

--select
PS3="select menu"  #提示菜单
select com in c1 c2 c3 all none
do
case $com in
 c1|c2|c3) echo "$com";;
 all) echo "c1 c2 c3";;
 none) break;;
 *) echo "erro ";;
esac
done


--awk
BEGIN:awk开始执行,运行一次
END:awk运行到最后执行

--关键字
FILENAME:文件名
NR:行数
NF:字段数
OFS:输出字段分隔符 默认空格
FS:输出 默认空格和制表符号
OFMT:数字输出格式
ORS:输出记录分隔符 默认新起一行
RS:输入记录分隔符  默认新起一行

$1 表字段1 类推
USER_INPUT_PRICE=$1
awk '
 BEGIN { FS=":"}
  ($2>price) && (1==1) { printf "%s %s %s\n", $1,",>",price; next}
  $2<=price { printf "%s %s %s\n", $1,",<=",price; }
' price="$USER_INPUT_PRICE" b.txt

--awk if
USER_INPUT_PRICE=$1
awk -FS=":" '{
  if(($2>price) && (1==1)) {
   printf "%s %s %s\n", $1,",>",price; next
  }else{
   printf "%s %s %s\n", $1,",<=",price;
  }
}' price="$USER_INPUT_PRICE" b.txt

--while 不推荐使用do while
while(x<NF){
 printf "%s\n",$x;
 x+=1;
}

--for
for(x=0;x<NF;x+=1){
 printf "%s\n",$x;
}

awk 的while if for 类c设计

--特殊参数
$0 命令名称
$n 参数 从1开始
$# 参数个数
$* 所有的参数被双重应用
$@ 独立的双重应用
$? 最后一个执行命令的推出状态
$$ 进程号
$!最后一个后台命令的进程号
$- 输出字符包含 i 表示交互式脚本

#获取命令输入的参数
# ./zyl.sh -f a -o b -v c
verbose=false
while getopts f:o:v OPTION ;
do
  case "$OPTION"  in
  f) echo "f=$OPTARG";;
  o) echo "0=$OPTARG";;
  v) echo "v=$OPTARG";;
  \?) echo "????";;
  esac
done


#别名
alias lsa="ls -a"
lsa

#取消别名
unalias lsa

 

--指定局部变量
typeset x=1


--输出唯一字符
uniq -c a.txt

--排序
sort -rk 1,2 b.txt
k:排序字段 1到2

-r:按逆序输出
-n:依照数值的大小排序。
-c:检查文件是否已经按照顺序排序。如果没有回提示。
-b:忽略每行前面开始出的空格字符。
--
   -d    排序时,处理英文字母、数字及空格字符外,忽略其他的字符。
   -f    排序时,将小写字母视为大写字母。
   -i    排序时,除了040至176之间的ASCII字符外,忽略其他的字符。
   -m    将几个排序好的文件进行合并。
   -M    将前面3个字母依照月份的缩写进行排序。
  
   -o<输出文件>    将排序后的结果存入指定的文件。
   -r    以相反的顺序来排序。
   -t<分隔字符>    指定排序时所用的栏位分隔字符。
   +<起始栏位>-<结束栏位>    以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。
   --help    显示帮助。
   --version    显示版本信息。

 

--多个词的替换
sed '/zyl/ s/1/2/; /tomcat/ s/1/3/' b.txt

--d 表删除 sed '/tomcat/ d' a.txt
--q退出
top | sed '1,5 !d;5q'

 

--分隔 cut
cut -f1- -s --output-delimiter='|' -d,  b.txt
-[b,c,f] 分别是:byte,char,field
-d,:以分隔符号:逗号
-s:去除没有分隔符的数据
--output-delimiter 输出的分隔符


--join 联合
join -1 1 -2 2 -o 1.1 -a 1 -o1.2 -o 2.1 -t, a.txt b.txt
-1 1 -2 2:相当于a.txt文件中的第一个字段,和b.txt表中的第二个字段
-o 1.1 -o1.2 -o 2.1 表示显示a.txt 中的第一二个字段,b.txt表中的第一个字段
-t,表示以逗号分隔
-a 1 表示不匹配的
join -1 1 -2 2 -o 1.1 -a 1 -o1.2 -o 2.1 -t, a.txt b.txt


--单个字符的处理 查询替换
tr '源字符' '' < a.txt > b.txt
tr '\r' '\n' < a.txt
tr 'a-z' 'A-Z' < a.txt
tr -s 'e' 连续e,替换成单个e
echo "a b"| tr '[:blank:]' ','
[:blank:] 表转义字符有
alnum 字母或数字
alpha 字母
blank 空格
cntrl 控制符
digit 数字
graph 可印刷字符,不包括空格
lower 小写字符
print 可印刷字符,包括空格
punct 标点符号
space 空格
upper 大写字符
xdigit 十六进制


--eval
output="> b.txt"
eval echo hell "$output"

--信号
SIGHUP  1  控制终端发起被挂着或控制进程死亡
SIGINT  2  键盘中断
SIGQUIT 3  来自键盘的推出信号
SIGKILL 9  杀死进程的信号
SIGLRM  14 定时时钟中断
SIGTERM 15 终止信号


--语法检测
/bin/sh -nv ./zyl.sh


--init
0 :关机
1 :单用户模式
2 :多用户模式
3 :网络多用户模式
4 :未用
5 :图像多用户模式或停机
6 :重启

--uname
a  所有信息
m  硬件类型
n  系统的主机名
r  发布的级别
s  操作系统的名称

你可能感兴趣的:(tomcat,linux,脚本,网络应用,ubuntu)