shell 知识梳理
一.shell环境(shell解释器)
1.Bourne Shell --- /usr/bin/sh 或 /bin/sh
2.Bourne Again Shell --- /bin/bash 应用最多,大多数linux系统默认的Shell
3.C Shell --- /usr/bin/csh
4.K Shell --- /usr/bin/ksh
在一个shell脚本第一行告诉系统解释此脚本应该用的解释程序;
#!/bin/bash
二.shell变量
1.变量定义时不需要加$符合
your_name="runoob.com"
另一种给变量赋值的方法为:
for file in ls /etc
2.使用变量时需要加$号
echo $your_name
echo ${your_name}
例:
for skill in Ada Coffe Action Java; do
echo "I am good at ${skill}Script"
done
3.只读变量
#!/bin/bash
myUrl="www.baidu.com"
readonly myUrl
myUrl="www.baidu2.com"
会报read only错误
4.删除变量
unset myUrl
三.shell字符串
单引号的任何字符串都会原样输出;
单引号中不能出现单引号(对单引号使用转义符后也不行);
双引号里可以有变量;
双引号里可以出现转义字符;
your_name="viean"
greeting="hello ${your_name}"
获取字符串长度
echo ${#your_name} #输出5
提取子字符串
echo ${your_name:3:2} #输出an
查找子字符串
str="runoob is a great company"
expr index "$str" is #输出8
expr length "$str" #输出字符串长度
四.shell数组
1.定义:
数组名=(值1 值2 值3 值4 值5)
array_name=(value0 value1 value2) #不能有空格
或
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
2.读取
echo ${array_name[0]}
使用@符号可以获取数组中的所有元素
echo ${array_name[@]}
3.获取数组的长度
取得数组元素的个数
length=${#array_name[@]}
或
length=${#array_name[*]}
取得数组第0个元素的长度
length=${#array_name[0]}
五.shell参数传递
sh mybash.sh ABC 123 456
$0 执行的文件名,如上结果为:mybash.sh
$1 第一个参数,如上结果为:ABC
$# 传递到脚本的参数个数,如上结果为:3
$* 以一个单字符串显示所有向脚本传递的参数;
[email protected] 同$*,但是使用时加引号,并在引号中返回每个参数;
$$ 进程的ID号;
$! 后台运行的最后一个进程的ID号
$- 显示shell使用的当前选项;set命令功能相同;
$? 最后命令退出状态,0表示没有错误,其他任何值表明有错误;
六.shell运算符
1.算术运算符
原生bash不支持简单数学运算,但可以通过 expr 和 awk 命令实现,expr最常见;
val=`expr 2 + 2` #+号两边必须要有空格!
echo $val #结果4
val=`expr 2+2` #+号两边没有空格!
echo $val #结果2+2
a=10
b=20
echo `expr $a \* $b` #结果200,注意需要\*
echo `expr $a == $b ` #结果0
echo `expr $a != $b ` #结果1
echo `expr $b % $a ` #求余,返回0
在 MAC 中 shell 的 expr 语法是:$((表达式)),如:echo $((2+2))
2.关系运算符
只支持数字,不支持字符串,除非字符串的值是数字;
-eq : 检测是否相等;
-ne : 不等于;
-gt : 是否大于;
-lt : 是否小于;
-ge : 是否大于等于;
-le : 是否小于等于;
a=10
b=20
if [ $a -eq $b ]
then
echo "$a -eq $b : a等于b"
else
echo "$a -eq $b : a不等于b"
fi
3.布尔运算符
! : 非运算符
-o : 或运算符
-a : 与运算符
#!/bin/bash
a=10
b=20
if [ $a != $b ]
then
echo "$a != $b : a不等于b"
else
echo "$a != $b : a等于b"
fi
if [ $a -lt 100 -o $b -gt 150 ]
then
echo "$a -lt 100 -o $b -gt 150 : true"
else
echo "$a -lt 100 -o $b -gt 150 : false"
fi
if [ $a -lt 100 -a $b -gt 150 ]
then
echo "$a -lt 100 -a $b -gt 150 : true"
else
echo "$a -lt 100 -a $b -gt 150 : false"
fi
4.逻辑运算符
&& : 逻辑AND
|| : 逻辑OR
#!/bin/bash
a=10
b=20
if [[ $a -lt 100 || $b -gt 150 ]] #注意需要为[[...]]
then
echo "$a -lt 100 -o $b -gt 150 : true"
else
echo "$a -lt 100 -o $b -gt 150 : false"
fi
if [[ $a -lt 100 && $b -gt 150 ]]
then
echo "$a -lt 100 -a $b -gt 150 : true"
else
echo "$a -lt 100 -a $b -gt 150 : false"
fi
5.字符串运算符
= : 两个字符串是否相等
!= : 两个字符串是否不等
-z : 字符串长度是否为0, 为0返回true
-n : 字符串长度是否不为0, 不为0返回true
str : 检测字符串是否为空,不为空返回true
a="abc"
b="def"
c=""
if [ $a = $b ]
then
echo "$a = $b : true"
else
echo "$a = $b : false"
fi
if [ $a != $b ]
then
echo "$a != $b : true"
else
echo "$a != $b : false"
fi
if [ -z $a ]
then
echo "-z $a : true"
else
echo "-z $a : false"
fi
if [ -n $a ]
then
echo "-n $a : true"
else
echo "-n $a : false"
fi
if [ $c ]
then
echo "$c : 为空,返回true"
else
echo "$c : 为空,返回false"
fi
6.文件测试运算符
-b : 是否为块文件
-c : 是否为字符设备文件
-d : 是否为目录
-f : 检测文件是否是普通文件(即不是目录,也不是设备文件)
-g : 检测文件是否设置了SGID位
-k : 检测文件是否设置了粘着位(Sticky Bit)
-p : 检测文件是否是有名管道
-u : 检测文件是否设置了SUID位
-r : 检测文件是否可读
-w : 检测文件是否可写
-x : 检测文件是否可执行
-s : 检测文件大小是否在于0
-e : 检测文件是否存在
file="/var/www/runoob/test.sh"
if [ -e $file ]
then
echo "$file : 文件存在"
else
echo "$file : 文件不存在"
fi
七.echo 与 printf命令
1.echo显示换行:
echo -e "OK! \n new Line" -e为开启转义
echo -e "OK! \C" -e开启转义,\C不换行
2.printf
默认printf不像echo自动添加换行符;需要手动添加\n
用法:
printf format-string [arguments]
%-10s : -表示左对齐,10s表示指定宽度为10的字符
%-4.2f : 格式化为小数,其中.2指保留2位小数
%d : 数值型
printf "%-10s %-8s %-4s\n" 姓名 性别 体重KG
printf "%-10s %-8s %-4s\n" 张三 男 60KG
printf "%-10s %-8s %-4s\n" 李四四 男 90KG
printf "%d %s\n" 100 abc
printf "%d %s\n" #没有参数是,%d默认为0; %s默认为null
八.test命令
用于检查某个条件是否成立
num1=100
num2=200
if test $[num1] -eq $[num2]
then
echo "两个数相等"
else
echo "两个数不等"
fi
num1="ru1noob"
num2="runoob"
if test $num1 = $num2
then
echo '两个字符串相等!'
else
echo '两个字符串不相等!'
fi
if test -e ./notFile -o -e ./bash
then
echo '至少有一个文件存在!'
else
echo '两个文件都不存在'
fi
九.shell流程控制
1.if语句
if condition
then
command1
command2
else
command3
fi
各分支中语句不能为空;
写为一行时:
if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi
2.循环
2.1 for循环
for var in a b c d ... z
do
command1
command2
done
2.2 while语句
while condition
do
command
done
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
util循环与while循环相反,执行一系列命令直到条件为真时停止;
2.3 case语句
case 值 in
模式1)
command1
command2
;;
模式2)
command3
command4
;;
esac
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
1|2) echo '你选择了 1或2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac
break 跳出循环
contine 结束本次循环,进行下次循环
十.shell函数
1.定义:
[function] function_name [()]
{
action;
[return int;]
}
说明:可以带function fun()定义,也可以func()定义,不带任何参数;
参数返回只能是0-255的数值,如不return默认返回最后一条命令的运行结果;
#!/bin/bash
addFunc(){
echo "第一个参数 $1"
echo "第二个参数 $2"
return $1
}
addFunc 100 200
a=$(addFunc 100 200)
echo $a
结果:
第一个参数 100
第二个参数 200
第一个参数 100 第二个参数 200
十一.shell输入/输出重定向
command > file 将输出重定向到文件
command < file 将输入重定向到文件
command >> file 将输出以追加的方式重定向到file
n > file 将文件描述符为n的文件重定向到file
n >& m 将输出文件m和n合并
n <& m 将输入文件m和n合并
注:文件描述符为0通常是标准输入STDIN;1是标准输出STDOUT; 2是标准错误输出STDERR
wc -l users
2 users
wc -l < users
2
command1 < infile > outfile #同时替换输入和输出,执行command1,从文件infile读取内容,然后将输出写入到outfile中
command 2 > file #标准错误重定向到file
command > file 2>&1 #如果希望将 stdout 和 stderr 合并后重定向到 file
HERE DOCUMENT
$ wc -l << EOF
欢迎来到
菜鸟教程
EOF
3
/dev/null 为垃圾箱文件,不希望在输出在屏幕或者文件中时,用此项
command1 > /dev/null
command1 > /dev/null 2>&1 #屏蔽stdout和stderr
十二.shell文件包含
. filename #.与文件名中间有一空格
或
source filename
shell中没有多行注释,只有单选注释 #