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}'`