我爱编程

shell 知识梳理

2018-04-11  本文已影响0人  viean

一.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[@]}
or
length=${#array_name[*]}

取得数组第0个元素的长度

length=${#array_name[0]}

五.shell参数传递
sh mybash.sh ABC 123 456

0 执行的文件名,如上结果为:mybash.sh1 第一个参数,如上结果为:ABC
# 传递到脚本的参数个数,如上结果为:3* 以一个单字符串显示所有向脚本传递的参数;
@ 同*,但是使用时加引号,并在引号中返回每个参数;
$$ 进程的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中没有多行注释,只有单选注释 #

知识来源

上一篇下一篇

猜你喜欢

热点阅读