命令解释器,计算机沟通交流的媒介
常见的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
#!/bin/bash
echo "Hello World"
脚本执行:
平时用第一种方式较多
>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 -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 逻辑或
! 逻辑非
#!/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"
#打印文件权限
#!/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
#!/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
#!/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
#!/bin/bash
for time in morning noon afternoon evening
do
echo $time
done
#!/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
#/bin/bash
s=0
for ((i=1;i<=100;i=i+1))
do
s=$(($s+$i))
done
echo $s
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