Shell编程

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

你可能感兴趣的:(Shell编程)