1.echo输出命令
echo ‘字符串‘
echo -e ‘字符串‘	//支持反斜杠
2.执行sh文件
先赋予权限
chmod 755 hello.sh
执行
/root/hello.sh		//绝对路径
./hello.sh		//相对路径
或bash hello.sh
dos2unix hello.sh //从windows格式转换为linux格式
3.别名
alias vi=‘vim‘		//把vim取个名字叫vi
vi /root/.bashrc //让别名永久生效
unalias 别名 //删除别名
4.输出重定向
比如:ls > abc 		//把ls输出正确的信息,先覆盖,再显示在abc文件中。
ls >> abc		//追加显示
ls 2>err		//错误输出
常用的把正确和错误的都输出:
lst &>abc
把正确的和错误的分别输出到2个文件中
lst > abc 2>err
统计文件有多少行
wc -l 文件名
5.多命令顺序执行
多个命令执行
命令1;命令2	//分号隔开
&&
||
6.管道符
命令1 | 命令2	//命令1正确输出作为命令2的操作对象
如:ll -a /etc/ | more
示例:找到不是root的所有用户
cat /etc/passwd | grep /bin/bash | grep -v root | cut -d ":" -f 1
shell编程语法
     含义:从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作。在Linux GUI日益完善的今天,在系统管理等领域,Shell编程仍然起着不可忽视的作用。深入地了解和熟练地掌握Shell编程,是每一个Linux用户的必修 功课之一。
	
     sh的创建:
	利用vi等文本编辑器编写Shell脚本的格式是固定的,如下:
#!/bin/sh
#comments
Your commands go here
/uer/bin/ls (表示命令list。)
首行中的符号#!告诉系统其后路径所指定的程序即是解释此脚本文件的Shell程 序。如果首行没有这句话,在执行脚本文件的时候,将会出现错误。后续的部分就是主程序,Shell脚本像高级语言一样,也有变量赋值,也有控制语句。除第 一行外,以#开头的行就是注释行,直到此行的结束。如果一行未完成,可以在行尾加上",这个符号表明下一行与此行会合并为同一行。 
 
一。shell结构
	1.#!指定执行脚本的shell
	
	2.#注释行
3.命令和控制结构
 二。创建shell程序的步骤
	1.创建一个包含命令和控制结构的文件
2.修改这个文件的权限使它可以执行,使用chmod u+x
3.执行 ./example (也可以使用“sh example”执行)
三。shell变量
        分为:临时变量(shell程序内部定义的,包括用户自定义变量和位置变量)和永久变量 (既环境变量)
规范:使用下划线或字母开头
注:如果对一个已经有值的变量赋值,新值将取代旧值。取值的时候要在变量名前加$,$variable_name可以在引号中使用,这一点和其他高级语言是明显不同的。如果出现混淆的情况,可以使用花括号来区分,例如:
echo "Hi, $as"
就不会输出“Hi, hello worlds”,而是输出“Hi,”。这是因为Shell把$as当成一个变量,而$as未被赋值,其值为空。正确的方法是:
echo "Hi, ${a}s" 
单引号中的变量不会进行变量替换操作。
	
	变量赋值 A=10
		A=$b
set命令可以列出变量
查看变量set name
删除变量unset name
定义环境变量
export 变量名=变量值
echo $PS1
PATH:系统查找命令的路径
如:PATH="$PATH":/test/sh	//PATH变量叠加
配置环境变量
/etc/profile	对所有用户生效
~/.bash_profile 对当前用户生效
特殊变量
$? :执行一个命令的返回值。(如输入一个正常命令,返回0.如果不是命令则返回非0)
$# : 统计参数的个数。
$* :显示所有的参数。
$$ :脚本执行的pid
$0 :显示shell文件名,既命令本身。
$n :n代表位置变量,既参数(如执行sh load.sh name1 name2。 shell脚本的$1就对应name1)。
如:脚本test.sh
$0
$1
$2
$3
sum=$(( $1+$2+$3 ))
echo "sum is :$sum"
运行:./test.sh 11 22 33
shell脚本调试
变量测试语句
正则表达式
grep "a\{3\}" abc.txt //表示匹配包含有连续3个a的行
字符截取命令cut
如 cut -f 2 student.txt 		  //提取第二列
-d 指定分割符
如 cut -d ":" -f 1,3 /etc/passwd
awk 命令
awk ‘条件1{动作1} 条件2{动作2}......‘ 文件名
df -h | grep "18G" | awk ‘{print $4}‘ | cut -d "%" -f 1		//查找系统盘的百分比
BEGIN 在打印之前执行
df -h | grep "18G" | awk ‘BEGIN{print "this is a df"}{print $4}‘ | cut -d "%" -f 1
FS内置变量
cat /etc/passwd | grep "/bin/bash" | awk ‘BEGIN {FS=":"} {printf $1 "\t" $3 "\n"}‘ //注:如果不加BEGIN 第一行不会被冒号分割。
awk条件
如:cat student.txt | grep -v Name | awk ‘$6>=87 {printf $2 "\n"}‘
//提取平均成绩大于87的学生名字,第一行不提取,所以过滤grep -v Name	
sed命令
sed -n ‘2p‘ sutdent.txt		//打印第二行数据
sed -i ‘3,4d‘ student.txt	//删除第三行到第4行
sed -i ‘s/旧字符串/新字符串/g‘ student.txt	//字符串替换
sed ‘s/^[0-9]*$//g‘		//数字替换为空
sort命令
sort /etc/passwd		//根据第一个按字母排序
sort -n -t ":" -k 3,3 /etc/passwd //指定分隔符是“:”,以第3个字段的数字(-n)排序
-r 反向排序
四。Shell命令
read命令 :从键盘读入数据,赋给变量。如:read NAME(Name既变量名,后面可以跟多个变量read N1 N2)。
	   如:shell脚本里面:
	   read first second third
	   echo $first
	   echo $second
	   echo $third
	  在命令里面
	  sh test.sh 回车输入1 2 3
	#!/bin/bash
	read -t 30 -p "please input you name:" name
	echo "你输入的姓名是$name"
	read -s -t 30 -p "please input you password:" pwd
	echo -e "\n"
	echo $pwd
	read -n 1 -t 30 -p "[Y/N]:" yon
	echo -e "\n"
	echo $yon
	
运算符
declare声明变量类型
declare [+/-][选项] 变量名
选项:
			-:给变量设定类型属性
			+:取消变量的类型属性
			-i:将变量声明为整数型								//linux默认数据类型都为字符串型
			-x:将变量声明为环境变量
			-p:显示指定变量的被声明的类型
ff=$(( $aa+$bb ))			//$(())运算式推荐用这种
declare -i cc=$aa+$bb		//简单的数值运算		
dd=$(expr $aa + $bb)		//$()	也表示命令替换符
			
expr命令 :变量的算术运算,只对整数型变量进行算术运算。比如8/3 则=2 忽略了小数点。变量和变量相加中间要有空格。
	   
	   如:expr 3 + 5 (注*乘号需要转义expr 3 \* 5)
10+20+30
value=`expr $a + $b + $c` (``表示命令替换符)
test命令 :用于测试变量是否相等,是否为空。文件类型等。
	   test 整数,字符串,文件
字符串测试
  	   test str1=str2  测试字符串是否相等(!= 不相等)
 	   test str1       测试字符串是否不为空
	   test -n str1       测试字符串是否不为空
	   test -z str1       测试字符串是否为空
	
	   整数测试
	   test int1 -eq int2 测试整数是否相等
	   test int1 -ge int2 测试int1是否>=int2
	   test int1 -gt int2 测试int1是否>int2
	   test int1 -le int2 测试int1是否<=int2
	   test int1 -lt int2 测试int1是否<int2
test int1 -ne int2 测试整数是否不相等
	   文件测试:
	   
	   test -d file 指定文件是否为目录
	   test -f file 指定文件是否为目录
	   test -x file 指定文件是否为目录
	   test -r file 指定文件是否为目录
	   test -w file 指定文件是否为目录
	   if test -d $1 then
	   注:上面的test测试语句可用[]进行简化
	   如 if test -d $1 then 等价于 if [ -d $1 ] then
	   例:周一到周日下午13点到14点每2分钟执行shell文件
	   第一步:crontab -e
	   第二步:*/1 13-14 * * 0-6 /test/b.sh
shell应用实例
shell脚本的
如这一行:/user/bin/write root < /tmp/sysinfo && /bin/rm /tmp/sysinfo
其实表示:给管理员root写一个文件sysinfo(文件在/tmp路径里面),如果发送成功就删除这个文件。
五。shell语句
条件判断
test -e /root/install.log	//判断文件是否存在
或
[ -e /root/install.log ]		
echo $?
test -f /root/student.txt && echo "yes" || echo "no" //判断文件是否为普通文件,类似3元运算符。
[ 23 -gt 22 ] && echo yes || echo no //2个整数之间的判断
[ -z $name ] && echo no || echo yes //-z字符串为空返还no ,-n则代表字符串非空
[ "$aa" == "$bb" ] && echo yes || echo no //2个字符串是否相等
[ -n "$aa" -a "$aa" -gt 23 ] && echo yes || echo no //-a代表and,-o代表or,!代表非
if 语句
if (条件)then 。。。。。else....fi
if (条件)then。。。。。elif(条件) then。。。。。else。。。。fi
exit 0:表示正常退出
for....done语句
 格式: for Day in mondey Tuseday
	 
	do
		  echo "The Day is"
	done	
或者for(( i=1;i<=$sum;i=i+1 ))
while 语句
 格式:
	如:
	num=1
	while [ $num -le 10 ] 
	do 
	   SUM=`expr $num \* $num`
	   echo $SUM
	   num=`expr $num + 1`
	done
until语句:条件语句不成立执行。
  格式:
	如:
	num=1
	until [ $num -lt 10 ] 
	do 
	   SUM=`expr $num \* $num`
	   echo $SUM
	   num=`expr $num + 1`
	done
case....esac语句
	
	$1表示变量 start)表示字符串 start表示要执行的函数 *表示空格或相当于default
 格式:case "$1" in
	  start)
	   start
		;;
	  stop)
	   stop
		;;	
	  *)	
	   echo "you dont wiite"
	   exit 1
	esac
例子:
#!/bin/bash
echo "1:shanghai,2:guangzhou,3:chengdu"
read -t 30 -p "please input your chooise: " cho
case "$cho" in
        "1")
                echo "shanghai de jipiao yijing fashou!"
                ;;
        "2")
                echo "guangzhou de jipiao!!"
                ;;
        "3")
                echo "chengdu de jipiao!!!"
                ;;
        *)
                echo "erro you must choice 1/2/3"
                exit 1
                ;;
esac
select 语句:类似表单选项
  格式
select var in "linux" "unix"
do
	break
done
echo "you have selected $var"
六。函数用法
	函数名(){}
	
	函数的调用:函数名
	注:函数中的变量均为全局变量,没有局部变量。
	//函数中的参数用$1,$2....来引用。
	
	findcmd(){ echo "找到 $a $b"}
调用 findcmd
七。其它用法
	awk -F 命令
	如:查找uid=0的用户
	第一步:找出passwd为root的用户
	grep root /etc/passwd
	显示
	root:x:0:0.....此处省略
	第二步
	则可以看出$1为用户名 $3表示uid 那么就用“:”分隔符分开,没有:号则默认是空格。
	则执行:awk -F: ‘$3==0 {print $1}’ /etc/passwd
 	则显示root用户。
	如:检测系统中密码为空的用户
	awk -F: ‘length($2)==0 {print $1}’ /etc/shadow
	如:踢出其它用户
	第一步:先找到进程中的用户。ps -aux | grep root | awk ‘{print $2}‘
	第二步:打印用户对应的pid。ps -aux | grep root | awk ‘{print $2}‘
	第三步:踢出用户则。 kill `ps -aux | grep root | awk ‘{print $2}‘`
原文:http://www.cnblogs.com/amazinggang/p/5198614.html