linux shell学习

参考:

http://www.cnblogs.com/suyang/archive/2008/05/18/1201990.html

http://www.cnblogs.com/xuqiang/archive/2011/04/27/2031034.html

http://www.cnblogs.com/xudong-bupt/p/3721210.html


记录学习的笔记

1、hello world

helloshell.sh
#!/bin/bash
#comments
echo "hello world";

运行

[root@u1 shell_learn]# sh helloshell.sh
hello world

查看shell脚本有无语法错误

[root@u1 shell_learn]# sh -n helloshell.sh

查看展开shell脚本执行

[root@u1 shell_learn]# sh -x helloshell.sh
+ echo 'hello world'
hello world

打印shell读取内容

[root@u1 shell_learn]# sh -v helloshell.sh
#!/bin/bash
#comments
echo "hello world";
hello world


查看当前执行shell 版本

[root@u1 shell_learn]# ps
  PID TTY          TIME CMD
39366 pts/3    00:00:00 bash
44076 pts/3    00:00:00 ps


 2、一些细节

just for record some detail
like
sh -n ifshell.sh
sh -v ifshell.sh
sh -x ifshell.sh
``--get the command then execute ,output the result
expr--mean a expression
\*--translate
$*--all parameter,not include the shell name
$#--count the parameter number,not include the shell 
$0--the shell name
$1--the first parameter 
$2
-eq -ne -lt -le -gt -ge
! -a -o
= != str
for-- if use ; then
	if no ; 
	then


条件描述

#!/bin/sh
#test condition
#[ condition ]
#echo $?
#1--file--[ -d -f -L -r -w -x -u -s ]
#2--logic--[ -a -o ! ]
#3--string--[ = != -z -n ]
#4--num--[ -eq -ne -gt -lt -le -ge ]
#5--expr--
echo "file desc"
[ -d basename.sh ]
echo "$?"
echo "logic desc"
test -f basename.sh -a -r cat.sh
echo "$?"
echo "string desc"
str="hello"
test -n str
echo "$?"
echo "num desc"
num=10
test $num -gt 5
echo "$?"
echo "expr desc"
echo "`expr 4 + 5`"
echo "`expr 4 - 5`"
echo "`expr 10 / 5`"
echo "`expr 4 \* 5`"

结果

 

[u1@u1 common]$ sh -x test.sh
+ echo 'file desc'
file desc
+ '[' -d basename.sh ']'
+ echo 1
1
+ echo 'logic desc'
logic desc
+ test -f basename.sh -a -r cat.sh
+ echo 0
0
+ echo 'string desc'
string desc
+ str=hello
+ test -n str
+ echo 0
0
+ echo 'num desc'
num desc
+ num=10
+ test 10 -gt 5
+ echo 0
0
+ echo 'expr desc'
expr desc
++ expr 4 + 5
+ echo 9
9
++ expr 4 - 5
+ echo -1
-1
++ expr 10 / 5
+ echo 2
2
++ expr 4 '*' 5
+ echo 20
20




3、if

[root@u1 shell_learn]# sh ifshell.sh 5
5 number is postive
[root@u1 shell_learn]# sh ifshell.sh -5
-5 number is negative

内容

#!/bin/bash
#comments
#$# get the input parameter , not include the command
if [ $# -ne 1 ]
#then must seperate if
then
	echo "$0 : you must input a number"
	exit 1
fi
#test like [ ] 
if test $1 -gt 0 
then
	echo "$1 number is postive"
else
	echo "$1 number is negative"
fi


 if -else

[root@u1 shell_learn]# sh ifelshell.sh
ifelshell.sh:you must a number
[root@u1 shell_learn]# sh ifelshell.sh 5
5 is a positive
[root@u1 shell_learn]# sh ifelshell.sh -5
-5 is a negative
[root@u1 shell_learn]# sh ifelshell.sh 0
0 is equal 0
[root@u1 shell_learn]# sh ifelshell.sh a
ifelshell.sh: line 10: [: a: integer expression expected
ifelshell.sh: line 13: [: a: integer expression expected
ifelshell.sh: line 16: [: a: integer expression expected
a is not a number


内容

#!/bin/bash
#comments
#test if ..elif  else  fi
if [ $# -ne 1 ]
then
	echo "$0:you must a number"
	exit 1
fi
#if elif else fi
if [ $1 -gt 0 ]
then
	echo "$1 is a positive"
elif [ $1 -lt 0 ]
then
	echo "$1 is a negative"
elif [ $1 -eq 0 ]
then
	echo "$1 is equal 0"
else
	echo "$1 is not a number"
fi



4、while

[root@u1 shell_learn]# sh whileshell.sh
whileshell.sh: must input a number
[root@u1 shell_learn]# sh whileshell.sh 4
4 * 0 =0
4 * 1 =4
4 * 2 =8
4 * 3 =12
4 * 4 =16
4 * 5 =20
4 * 6 =24
4 * 7 =28
4 * 8 =32
4 * 9 =36
4 * 10 =40


内容

#!/bin/bash
#comment
#test while
if [ $# -ne 1 ]
then
	echo "$0: must input a number"
	exit 1
fi

i=0
while [ $i -le 10 ]
do
#``--mean calculate expr and output the result
	echo "$1 * $i =`expr $1 \* $i`"
	i=`expr $i + 1`
done



5、for

[root@u1 shell_learn]# sh forshell.sh
weleome 1 times
weleome 2 times
weleome 3 times
11111
22222
33333
44444
55555

11111
22222
33333
44444
55555

内容

 

#!/bin/bash
#comments
#test for
for ii in 1 2 3
do
	echo "weleome $ii times"
done

for(( i = 1; i <= 5; i++  ))
do
         for(( j = 1; j <= 5; ++j ))
         do
                 echo -n "$i"
         done

# print a new line
         echo ""
 done
echo ""
# nested for
for(( i = 1; i <= 5; i++ ))
do
	for(( j = 1; j <= 5; j++ ))
	do
		echo -n "$i"
	done
#
	echo ""
done



6、case

[root@u1 shell_learn]# sh caseshell.sh
caseshell.sh: must input a command
[root@u1 shell_learn]# sh caseshell.sh 1
1 is not a valid command
[root@u1 shell_learn]# sh caseshell.sh delete
delete the db
[root@u1 shell_learn]# sh caseshell.sh select
select the db


内容

#!/bin/bash
#comments
# test case
if [ $# -ne 1 ]
then 
	echo "$0: must input a command"
	exit 1
fi
action=$1
case $action in
	"update")
		echo "update the db"
		;;
	"select")
		echo "select the db"
		;;
	"delete")
		echo "delete the db"
		;;
	*)
		echo "$action is not a valid command"
		;;
esac


7、function and args

[root@u1 shell_learn]# sh funcshell.sh
shell name args:funcshell.sh
all function args:-f foo bar
all function agrs_num 3
the first arg : -f
the second arg : foo:
shell name args:funcshell.sh
all function args:foo bar
all function agrs_num 2
the first arg : foo
the second arg : bar:


内容

#!/bin/bash
#comments
# test function
function demo(){
	echo "shell name args:$0"
	echo "all function args:$*"
	echo "all function agrs_num $#"
	echo "the first arg : $1"
	echo "the second arg : $2:"
	shift
	echo "shell name args:$0"
	echo "all function args:$*"
	echo "all function agrs_num $#"
	echo "the first arg : $1"
	echo "the second arg : $2:"
}

#call the function

demo -f foo bar


8、date

[root@u1 shell_learn]# sh cmd_learn/date.sh
[root@u1 shell_learn]# cat cmd_learn/date.log
2015-07-22 11:44:21

内容

 

#!/bin/bash
#
echo "`date -d today +"%Y-%m-%d %T"`" > /home/u1/shell_learn/cmd_learn/date.log 


9、find

[root@u1 shell_learn]# sh cmd_learn/find.sh
[root@u1 shell_learn]# tail -f cmd_learn/find.log
/opt/ibm/db2/V10.5/license/sl_SI.iso88592
/opt/ibm/db2/V10.5/license/el_GR.iso88597
/opt/ibm/db2/V10.5/license/lt_LT.iso885913
/opt/ibm/db2/V10.5/license/pl_PL.iso88592
/opt/ibm/db2/V10.5/license/cs_CZ.iso88592
/opt/ibm/db2/V10.5/license/fr_FR.iso88591
/opt/ibm/db2/V10.5/license/de_DE.iso88591
/opt/ibm/db2/V10.5/license/es_ES.iso88591
/opt/ibm/db2/V10.5/license/pt_BR.iso88591
/opt/ibm/db2/V10.5/license/en_US.iso88591


内容

#!/bin/bash
#comments

find / -name "[a-z]*[0-9][0-9]" -print > find.log 2>&1
#find ./ -name "*.sh" -print > find.log 2>&1


10、in_out

[root@u1 shell_learn]# sh cmd_learn/in_out.sh
display
display

display         display :
first name : qq
second name :ali
qq ali
u1       tty1         2015-07-16 22:00
u1       pts/0        2015-07-17 00:34 (:0.0)
root     pts/3        2015-07-22 10:32 (192.168.147.1)
[root@u1 shell_learn]# cat wh
whileshell.sh  who.out
[root@u1 shell_learn]# cat who.out
u1       tty1         2015-07-16 22:00
u1       pts/0        2015-07-17 00:34 (:0.0)
root     pts/3        2015-07-22 10:32 (192.168.147.1)
[root@u1 shell_learn]# cat in_out.log
2015-07-22 11:57:59 1


内容

#!/bin/bash
#echo cat read tee |

#in--0  < <<
#out--1 > >>
#err--2 2>&1

#echo
echo "display"
echo -e "display \n"
echo -n -e "display \t"
echo -e "display :\c"

echo ""

#read
echo -e "first name : \c"
read name
echo -e "second name :\c"
read middle
echo "$name $middle"

#cat
#cat -v  > cat_read.log

#tee
who | tee who.out


#0 1 2
echo "`date -d today +"%Y-%m-%d %T"`" 1 >> in_out.log 2>&1



11、read

[root@u1 shell_learn]# sh readshell.sh
1.unix(sun os)
2.linux(redhat)
select your os choice [1 or 2] ?2
you pick up linux
[root@u1 shell_learn]# sh readshell.sh
1.unix(sun os)
2.linux(redhat)
select your os choice [1 or 2] ?4
what you donot like linux/unix


内容

#!/bin/sh
#comments
#define a variable
osch=0
#display prompt
echo "1.unix(sun os)"
echo "2.linux(redhat)"
echo -n "select your os choice [1 or 2] ?"
#wait user input
read osch
#if
if [ $osch -eq 1 ]
then
	echo "you pick up unix"
else
	#nested if
	if [ $osch -eq 2 ]
	then
		echo "you pick up linux"
	else
		echo "what you donot like linux/unix"
	fi
fi



12、rename file

[root@u1 shell_learn]# ls
back_syncDeptFtp.sh  forshell.sh       ifshell.sh           syncDeptFtp.sh
caseshell.sh         funcshell.sh      in_out.log           whileshell.sh
cmd_learn            getFtpFile.sh     multisyncDeptFtp.sh  who.out
data                 getSyncStatus.sh  readme.txt
debugshell.sh        helloshell.sh     readshell.sh
find.log             ifelshell.sh      rename.sh
[root@u1 shell_learn]# sh rename.sh
       rename--renames a number of files using sed regular repressions
       USAGE: rename 'regexp' 'relpacement' files
       EXAMPLE:rename all *.HTM files in *.html
       rename 'sh$' 'SH' *.sh
[root@u1 shell_learn]# sh rename.sh sh$ SH *.sh
renaming back_syncDeptFtp.sh to back_syncDeptFtp.SH
renaming caseshell.sh to caseshell.SH
renaming debugshell.sh to debugshell.SH
renaming forshell.sh to forshell.SH
renaming funcshell.sh to funcshell.SH
renaming getFtpFile.sh to getFtpFile.SH
renaming getSyncStatus.sh to getSyncStatus.SH
renaming helloshell.sh to helloshell.SH
renaming ifelshell.sh to ifelshell.SH
renaming ifshell.sh to ifshell.SH
renaming multisyncDeptFtp.sh to multisyncDeptFtp.SH
renaming readshell.sh to readshell.SH
renaming rename.sh to rename.SH
renaming syncDeptFtp.sh to syncDeptFtp.SH
renaming whileshell.sh to whileshell.SH
[root@u1 shell_learn]# ls
back_syncDeptFtp.SH  forshell.SH       ifshell.SH           syncDeptFtp.SH
caseshell.SH         funcshell.SH      in_out.log           whileshell.SH
cmd_learn            getFtpFile.SH     multisyncDeptFtp.SH  who.out
data                 getSyncStatus.SH  readme.txt
debugshell.SH        helloshell.SH     readshell.SH
find.log             ifelshell.SH      rename.SH


内容

#!/bin/bash
#comments
# test rename file
if [ $# -lt 3 ] 
then
cat<<HELP
       rename--renames a number of files using sed regular repressions
       USAGE: rename 'regexp' 'relpacement' files
       EXAMPLE:rename all *.HTM files in *.html
       rename 'sh$' 'SH' *.sh
HELP
	exit 0
fi
#
old=$1
new=$2
shift
shift
for file in $* 
do
	if [ -f $file ]; then
		newfile=`echo $file | sed "s/${old}/${new}/g"`
			if [ -f $newfile ] ;then
				echo "error:$newfile exists already"
			else
				echo "renaming $file to $newfile"
				mv $file $newfile
			fi
	fi
done


13、debug info

[root@u1 shell_learn]# sh -v debugshell.sh
#!/bin/bash
#comments
# test debug
tot=`expr $1 + $2`
expr $1 + $2
expr: 语法错误
echo $tot

[root@u1 shell_learn]# sh -v debugshell.sh 4 5
#!/bin/bash
#comments
# test debug
tot=`expr $1 + $2`
expr $1 + $2
echo $tot
9


内容

#!/bin/bash
#comments
# test debug
tot=`expr $1 + $2`
echo $tot


14、crontab & nohup

#!/bin/bash
#cron crontab at & nohup
#crontab [-u user] -e -l -r
#crontab <filename>
#example
#0-59 0-23 1-31 1-12 0-6
#minute hour day month week shell_name
#1-3 1,3 *
#in shell_name ,the path use absolute path,not relative path

crontab--需要注意,提交到crontab中的脚本,需要使用绝对路径,因为crontab调度程序是不识别用户的环境变量的

eg:

每分钟都执行date.sh脚本

* * * * * /home/u1/shell_learn/cmd_learn/date.sh

&--后台进程运行

nohup--无需守护,也可运行


15、再附上几个觉得在部署系统时,常用的几个命令

查找端口、进程

[root@u1 shell_learn]# netstat -aonp | grep 8080
tcp        0      0 :::8080                     :::*                        LISTEN      60571/java          off (0.00/0/0)
[root@u1 shell_learn]# ps -ef | grep ps
root        41     2  0 Jul16 ?        00:00:00 [kpsmoused]
root      1615     1  0 Jul16 ?        00:00:00 cupsd -C /etc/cups/cupsd.conf
root     49227 39366  3 12:12 pts/3    00:00:00 ps -ef
root     49228 39366  0 12:12 pts/3    00:00:00 grep ps

关闭进程
kill -9 49228


最近在做一个项目   需要在shell中 进行数据库的同步、数据库的备份等功能,发现shell的功能,不得不要为他点赞,太强大了,以上为shell的基本内容,继续研究。。。

16、 常用命令

 

#!/bin/sh
#basename cat cp diff dircmp
#dirname du file fuser head
#logname mkdir more nl printf
#pwd rm rmdir shutdown sleep
#strings touch tty uname wc
#wait whereis who whoami


[u1@u1 common]$ cat script.sh
#!/bin/sh
#basename cat cp diff dircmp
#dirname du file fuser head
#logname mkdir more nl printf
#pwd rm rmdir shutdown sleep
#strings touch tty uname wc
#wait whereis who whoami script


basename

[u1@u1 common]$ cat basename.sh
#!/bin/sh
#basename path
#get file name from path
echo "uasge:`basename $0` file"
exit 1
[u1@u1 common]$ sh /home/u1/mtsd3/shell_learn/common/basename.sh
uasge:basename.sh file


tar

[u1@u1 common]$ cat tar.sh
#!/bin/sh
#tar options  files
cp cat.sh cat1.sh
ls
tar -zcvf  cat.tar.gz cat1.sh
rm -f cat1.sh
ls
tar -zxvf cat.tar.gz
ls

more

[u1@u1 common]$ cat more.sh
#!/bin/sh
#more filename
#space-next b--previous
 more ../../gateway3.1_mq/centrumserver/centrumserver.sh

nl

[u1@u1 common]$ cat nl.sh
#!/bin/sh
#nl filename
nl basename.sh


awk

#!/bin/sh
#as line deal 
#awk -F":" '{if($1~/u1/)print $1}' /etc/passwd
#awk  '{print NF}' basename.sh
#awk '{print $1,$2}' OFS='\t' basename.sh
awk 'BEGIN{math=0;eng=0;com=0;printf "Lineno.   Name    No.    Math   English   Computer    Total\n";printf "------------------------------------------------------------\n"}{math+=$3; eng+=$4; com+=$5;printf "%-8s %-7s %-7s %-7s %-9s %-10s %-7s \n",NR,$1,$2,$3,$4,$5,$3+$4+$5} END{printf "------------------------------------------------------------\n";printf "%-24s %-7s %-9s %-20s \n","Total:",math,eng,com;printf "%-24s %-7s %-9s %-20s \n","Avg:",math/NR,eng/NR,com/NR}' test0


[root@u1 common]# cat test0
Marry   2143 78 84 77
Jack    2321 66 78 45
Tom     2122 48 77 71
Mike    2537 87 97 95
Bob     2415 40 57 62


[root@u1 common]# sh awk.sh
Lineno.   Name    No.    Math   English   Computer    Total
------------------------------------------------------------
1        Marry   2143    78      84        77         239
2        Jack    2321    66      78        45         189
3        Tom     2122    48      77        71         196
4        Mike    2537    87      97        95         279
5        Bob     2415    40      57        62         159
------------------------------------------------------------
Total:                   319     393       350
Avg:                     63.8    78.6      70

grep sed cut awk 组合实例:


#!/bin/sh
#grep n--lien number
#     i--ignore case
#     want_search_text file
#cut -d delimiter -f field 1 2 
#awk -v variable  ' $1 $2'
#sed s separator $want_text$replace_text$g
#especially want value to variable, use ``
fl=`grep -ni dead alertDeadLock.log | cut -d: -f 2 | awk -v 'OFS=*' '{print $1,$2,$3 }' | sed 's$*$-$g'`


echo $fl


alertDeadLock.log文本内容

######################## 2015-12-22 18:28:24 ########################
LATEST DETECTED DEADLOCK
------------------------
151222 18:10:54
*** (1) TRANSACTION:
TRANSACTION 7A7BE4, ACTIVE 324 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 4 lock struct(s), heap size 1248, 3 row lock(s)
MySQL thread id 8574, query id 6854603 172.16.22.243 root statistics
select a,b,c from dltask where a='a8063001' and b='b99088948' and c='c71255728' for update
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 0 page no 1414168 n bits 336 index `uniq_a_b_c` of table `400_5.1_gsms`.`dltask` trx id 7A7BE4 lock_mode X locks rec but not gap waiting
Record lock, heap no 171 PHYSICAL RECORD: n_fields 4; compact format; info bits 0
 0: len 8; hex 6138303633303031; asc a8063001;;
 1: len 9; hex 623939303838393438; asc b99088948;;
 2: len 9; hex 633731323535373238; asc c71255728;;
 3: len 8; hex 0000000000000002; asc         ;;

*** (2) TRANSACTION:
TRANSACTION 7A7BE5, ACTIVE 316 sec starting index read
mysql tables in use 1, locked 1
4 lock struct(s), heap size 1248, 3 row lock(s)
MySQL thread id 8575, query id 6854605 172.16.22.243 root statistics
select a,b,c from dltask where a='a77584148' and b='b55038073' and c='c42437915' for update
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 0 page no 1414168 n bits 336 index `uniq_a_b_c` of table `400_5.1_gsms`.`dltask` trx id 7A7BE5 lock_mode X locks rec but not gap
Record lock, heap no 171 PHYSICAL RECORD: n_fields 4; compact format; info bits 0
 0: len 8; hex 6138303633303031; asc a8063001;;
 1: len 9; hex 623939303838393438; asc b99088948;;
 2: len 9; hex 633731323535373238; asc c71255728;;
 3: len 8; hex 0000000000000002; asc         ;;

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 0 page no 1347520 n bits 432 index `uniq_a_b_c` of table `400_5.1_gsms`.`dltask` trx id 7A7BE5 lock_mode X locks rec but not gap waiting
Record lock, heap no 190 PHYSICAL RECORD: n_fields 4; compact format; info bits 0
 0: len 9; hex 613737353834313438; asc a77584148;;
 1: len 9; hex 623535303338303733; asc b55038073;;
 2: len 9; hex 633432343337393135; asc c42437915;;
 3: len 8; hex 0000000000000001; asc         ;;

*** WE ROLL BACK TRANSACTION (2)

使用上面脚本后 输出

[root@u1 deadlock]# sh grep_cut_sed_awk.sh 
LATEST-DETECTED-DEADLOCK




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值