Home »  Linux » shell速成

shell简介

shell的概念

命令解释器,计算机沟通交流的媒介

常见的shell

常见的shell包括 bash-linux的标准shell sh 早期shell csh ksh tcsh unix

# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
/bin/zsh
/usr/bin/zsh

shell脚本

一个简单的hello world

#!/bin/bash

echo "Hello World"

脚本执行:

平时用第一种方式较多

bash常见功能

历史命令

>history

别名

.bashrc

alias ls="ls --color=never"
输出重定向
# 把ls得出的结果输入到a文件
ls > a

#把ls得出的结果追加到a文件
ls>>a

#命令的错误结果输入到文件

ls  gdlslga  2>>aa

#把正确和错误都放入文件

ls  &>aa

#正确信息输入aa,错误信息输入bb

ls  >> aa  2>>bb

#错误和正确都输入到aa,可以追加
ls  >>  aa  2>&1
多命令执行

命令1 ; 命令2 ; 命令3 命令123顺序执行。之间没有任何关

命令1 && 命令2 命令1正确执行后,命令2才会执行

命令1 || 命令2 命令1执行不正确,命令2才会执行

ls aa && echo "cunzai" || echo "bu cunzai! 
管道符
# 命令1  |  命令2 命令1的执行结果,作为命令2的执行条件
# 查询监听的端口号,并查看80
netstat -tlun | grep 80

# 分屏显示ls内容
ls  -l  /etc/  |  more              
ls -l /etc/ | grep yum

变量

本地变量

声明 变量名=变量值 注意:=号左右不能有空格 a=2 调用 echo $变量名字

环境变量

声明:export 变量名=变量值 export aa set 查看所有变量 env 查看环境变量 export 查看环境变量

查看:set 设置类型:declare -i整型 删除:unset 变量名

1)变量以等号连接值,等号不能有空格
2)变量名由数字和字母和下划线组成,不能以数字开头
3)变量值中有空格,用引号括起来
4)双引号内,有特殊字符。如$
5)单引号中特殊字符无含义
6)在变量值中,可以使用\转义符
7)变量值可以直接调用系统命令。 `命令` $(命令)
echo `ls`
8)变量值可以累加 aa=123 aa="$aa"456 echo $aa
--->123456
9)环境变量一定设为大写

echo $PATH

让脚本不在用路径 [临时生效]

PATH="$PATH":/home/mtao/shell 
# 在系统默认路径后,追加/home/mtao/shell 目
# 录作为命令查找路径
环境变量配置文件

/etc/profile

/etc/bashrc 所有用户生效

~/.bashrc

~/.bash_profile 只对指定用户生效

位置参数变量

>$0 命令自己

>$1 第一个参数

>$2 第二个参数

>$3 第三个参数

预定义变量

$? 上一个命令的返回值。 0 上一个命令正确执行 非 0

上一个命令不正确

$# 统计命令之后的参数个数

$* 返回所有参数

read

>read -p “提示信息” -t 等待时间 变量名

#!/bin/bash
read -p "please input num1:" -t 30 test1
read -p "input num2:" -t 30 test2
sum=$(( $test1 + $test2))
echo “num1 + num2 = $sum”

数值运算

>1)declare 方法

num1=123
num2=456
declare -i sum=$num1+$num2

>sum=$(( $num1 + $num2 )

>sum=$(expr $num1 + $num2) 注意+左右必须空格

条件测试 - 这个其实挺方便

测试文件类型

test -e 文件名 测试文件是否存在,存在为真
[ -e 文件名 ] 注意:[]中必须有空格
test -f 文件名 判断是否是普通文件
test -d 文件名 判断是否为目录
test -b 文件名 判断是否为块设备文件
test -c 文件名 字符设备文件

测试文件权限

test -r 文件名 判断是否有可读权限
test -w 文件名 可写
test -x 文件名 执行
test -s 文件名 判断是否为非空白,有内容为真

两个文档比较

[ file1 -nt file2 ] file1 是否比 file2 新
[ file1 -ot file2 ] file1 是否比 file2 旧
[ file1 -ef file2 ] file1 与 file2 是否是链接文件

两个数值之间判断

[ n1 -eq n2 ] n1 和 n2 是否相等
[ n1 -ne n2 ] n1 和 n2 是否不等
[ n1 -gt n2 ] n1 大于 n2
[ n1 -lt n2 ] n1 小于 n2
[ n1 -ge n2 ] n1 大于等于 n2
[ n1 -le n2 ] n1 小于等于 n2

判断字符串

[ -z 字符串 ] 判断字符串是否为空
[ 字符串 1 == 字符串 2 ] 判断字串 1 是否与字串 2 相等
[ $aa == $bb ] && echo 1 || echo 2
[ 字符串 1 != 字符串 2 ] 判断字串是否不等

多重判断

-a 逻辑与
[ -z $file -a -e $file ]
-o 逻辑或
! 逻辑非

Demo

#!/bin/bash
echo -e "nide wenjian shifou cunzai? wenjian quanxian shi shenme? \n\n"
read -p "please input filename:" -t 30 filename
test -z $filename && echo "please input filename!!" && exit 1
#-z 变量 判断字符串是否为空,为空为真
test ! -e $filename && echo "wenjian bucunzai!" && exit 2
#-e 变量 判断文件是否存在,存在为真 ! 逻辑非
test -f $filename && filetype=putong
#-f 是否为普通文件
test -d $filename && filetype=mulu
#-d 是否为目录
test -r $filename && perm="read"
#-r 是否有可读权限
test -w $filename && perm="$perm write"
#-w 是否可写
test -x $filename && perm="$perm executable"
#-x 是否可执行
echo -e "the filename is : $filename \n"
#打印文件名
echo -e "filetype is : $filetype \n"
#打印文件类型
echo -e "permision is : $perm \n"
#打印文件权限

流程控制

简介

Demo1 如果/boot 分区的空间使用超过 80%,则输出警告

#!/bin/bash
RATE=`df -hT | grep "/boot" | awk '{print $6}' | cut -d "%" -f1 `
if [ $RATE -gt 80 ]
then
echo "Warning,/boot DISK is full!"
fi

Demo2 判断 httpd 服务是否启动,如果没有启动则启动

#!/bin/bash
http=`netstat -tlun | awk '{print $4 "\n"}' | grep ":80$"`
(或 http=$( ps aux | grep httpd | grep -v grep))
if [ -z "$http" ]
then
echo "httpd meiyou qidong!"
/etc/rc.d/init.d/httpd start
else
echo "httpd runing"
fi

Demo3 判断输入的字符

#!/bin/bash
echo "if you want to beijing ,please input 1"
echo "if you want to shanghai ,please input 2"
echo "if you want to chengdu ,please input 3"
read -p "please input a num: " -t 30 num
if [ "$num" == "1" ]
then
echo "beijing!!!"
elif [ "$num" == "2" ]
then
echo "shanghai!!!!"
elif [ "$num" == "3" ]
then
echo "chengdu!!!"
else
echo "error,please input 1 or 2 or 3."
fi

Demo4 循环

#!/bin/bash
for time in morning noon afternoon evening
do
echo $time
done

Demo5 输入目录名,显示目录下所有内容

#!/bin/bash
read -p "please input a filename!" -t 30 filename
if [ -z $filename ];then
echo "please input!!!!!!"
exit 1
fi
if [ ! -e $filename ]
then
echo "$filename not cunzai!!"
exit 2
fi
#如果文件不存在,报错跳出
if [ ! -d $filename ]
then
echo "$filename is not driectory"
exit 3
fi
#如果不是目录,报错跳出
file=`ls $filename`
for test in $file
do
echo $test
done

Demo6 数值加加循环

#/bin/bash
s=0
for ((i=1;i<=100;i=i+1))
do
s=$(($s+$i))
done
echo $s

while 循环语句

while 命令或表达式
do
命令列表
done

批量添加用户

#!/bin/bash
i=1
while [ $i -le 20 ]
do
useradd stu$i
echo "123456" | passwd --stdin stu$i &> /dev/null
i=`expr $i + 1`
done

批量删除用户

#!/bin/bash
aa=`cat /etc/passwd | grep "/bin/bash"|grep -v "root"|cut -d ":" -f 1`
for i in $aa
do
userdel -r $i
done

批量添加

#!/bin/bash
aa=10
for ((i=1;i<=$aa;i=i+1))
do
useradd stu$i
echo "123456" | passwd --stdin stu$i &> /dev/null
echo $i
done

打印选择列表,输出选择

#!/bin/bash
echo -e "shanghai: 1\n"
echo -e "beijing: 2\n"
echo -e "chengdu: 3\n"
read -p "input your choice:" -t 30 choi
case $choi in
"1")
echo "shanghai!!!"
;;
"2")
echo "beijing!!!"
;;
"3")
echo "chengdu!!!"
;;
*)
echo "qing chongxin shuru!"
;;
esac