shell

Posted by 小兵兵 on Tuesday, December 17, 2019

目录

Shell

解析器

查看系统的解析器

[root@izm5eac6bnsz8uq175jkvez tmp]# cat /etc/shells 
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
[root@izm5eac6bnsz8uq175jkvez tmp]# echo $SHELL
/bin/bash

shell脚本

脚本以#!/bin/bash开头(指定解析器),编写shell脚本尽量用双引号

打印helloWorld

创建helloWorld.sh

[root@izm5eac6bnsz8uq175jkvez tmp]# vim helloWorld.sh 

输入以下内容

#!/bin/bash
echo 'helloWorld'

执行

方式一

[root@izm5eac6bnsz8uq175jkvez tmp]# bash helloWorld.sh 
helloWorld

方式二

修改helloWorld.sh文件具备执行权限,一般不建议使用chmod 777

[root@izm5eac6bnsz8uq175jkvez tmp]# chmod u+x helloWorld.sh 
[root@izm5eac6bnsz8uq175jkvez tmp]# ll helloWorld.sh 
-rwxr--r-- 1 root root 30 Dec 17 14:21 helloWorld.sh
[root@izm5eac6bnsz8uq175jkvez tmp]# ./helloWorld.sh 
helloWorld

shell变量

自定义变量

变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写

等号两侧不能有空格

bash中,变量默认类型都是字符串类型,无法直接进行数值运算

变量的值如果有空格,需要使用双引号或单引号括起来

定义变量

[root@izm5eac6bnsz8uq175jkvez tmp]# A=5
[root@izm5eac6bnsz8uq175jkvez tmp]# echo $A
5

删除变量

[root@izm5eac6bnsz8uq175jkvez tmp]# unset A
[root@izm5eac6bnsz8uq175jkvez tmp]# echo $A

[root@izm5eac6bnsz8uq175jkvez tmp]# 

静态变量,不能修改

[root@izm5eac6bnsz8uq175jkvez tmp]# readonly B=2
[root@izm5eac6bnsz8uq175jkvez tmp]# echo $B
2
[root@izm5eac6bnsz8uq175jkvez tmp]# B=9
-bash: B: readonly variable
[root@izm5eac6bnsz8uq175jkvez tmp]# 

变量的值如果有空格,需要使用双引号或单引号括起来

[root@izm5eac6bnsz8uq175jkvez tmp]# str=i love you
-bash: love: command not found
[root@izm5eac6bnsz8uq175jkvez tmp]# str='i love you'
[root@izm5eac6bnsz8uq175jkvez tmp]# echo $str
i love you
[root@izm5eac6bnsz8uq175jkvez tmp]# 

特殊变量

$n

n为数字,$0代表该脚本名称,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}

输出该脚本文件名称、输入参数1和输入参数2 的值

'$0 $1 $2'如果用单引号则原样输出,因此必须使用双引号

[root@izm5eac6bnsz8uq175jkvez tmp]# vim param.sh 
#!/bin/bash
echo "$0 $1 $2"
[root@izm5eac6bnsz8uq175jkvez tmp]# chmod u+x param.sh 
[root@izm5eac6bnsz8uq175jkvez tmp]# ./param.sh  1 2 3
./param.sh 1 2

$#

获取所有输入参数个数,常用于循环

[root@izm5eac6bnsz8uq175jkvez tmp]# vim param.sh 
#!/bin/bash
echo "$0 $1 $2"
echo $#
[root@izm5eac6bnsz8uq175jkvez tmp]# ./param.sh 1 2 3
./param.sh 1 2
3

$*

这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体

$@

这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待

[root@izm5eac6bnsz8uq175jkvez tmp]# vim param.sh 
#!/bin/bash
echo "$0 $1 $2"
echo $#
echo $*
echo $@
[root@izm5eac6bnsz8uq175jkvez tmp]# ./param.sh 1 2 3
./param.sh 1 2
3
1 2 3
1 2 3

$?

最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。

判断helloworld.sh脚本是否正确执行

[root@izm5eac6bnsz8uq175jkvez tmp]# ./helloWorld.sh 
helloWorld
[root@izm5eac6bnsz8uq175jkvez tmp]# echo $?
0

运算符

使用$((运算式))或者$[运算式]

计算3+22的值

[root@izm5eac6bnsz8uq175jkvez tmp]# echo 3+22
3+22
[root@izm5eac6bnsz8uq175jkvez tmp]# echo [3+22]
[3+22]
[root@izm5eac6bnsz8uq175jkvez tmp]# echo $[3+22]
25
[root@izm5eac6bnsz8uq175jkvez tmp]# echo $((3+22))
25

计算3-22的值

[root@izm5eac6bnsz8uq175jkvez tmp]# echo $((3-22))
-19

计算3*22的值

[root@izm5eac6bnsz8uq175jkvez tmp]# echo $((3*22))
66

计算3/22的值

[root@izm5eac6bnsz8uq175jkvez tmp]# echo $((3/22))
0

条件判断

[ condition ](注意condition前后要有空格)

两个整数之间比较

命令 说明
= 字符串比较
-lt 小于
-le 小于等于(less equal)
-eq 等于(equal)
-gt 大于(greater than)
-ge 大于等于(greater equal)
-ne 不等于(Not equal)

23比较

[root@izm5eac6bnsz8uq175jkvez tmp]# [ 2 -lt 3 ]
[root@izm5eac6bnsz8uq175jkvez tmp]# echo $?
0
[root@izm5eac6bnsz8uq175jkvez tmp]# [ 2 -gt 3 ]
[root@izm5eac6bnsz8uq175jkvez tmp]# echo $?
1

按照文件权限进行判断

命令 说明
-r 有读的权限(read)
-w 有写的权限(write)
-x 有执行的权限(execute)

判断helloWorld.sh文件是否具有可写权限

[root@izm5eac6bnsz8uq175jkvez tmp]# [ -w helloWorld.sh ]
[root@izm5eac6bnsz8uq175jkvez tmp]# echo $?
0

按照文件类型进行判断

命令 说明
-f 文件存在并且是一个常规的文件(file)
-e 文件存在(existence)
-d 文件存在并是一个目录(directory)

判断当前目录下是否存在helloWorld.sh文件

[root@izm5eac6bnsz8uq175jkvez tmp]# echo $?
0
[root@izm5eac6bnsz8uq175jkvez tmp]# [ -f helloWorld2.sh ]
[root@izm5eac6bnsz8uq175jkvez tmp]# echo $?
1

流程控制

if

[root@izm5eac6bnsz8uq175jkvez tmp]# vim if.sh 
#!/bin/bash
echo '开始if---->'
if [ $1 -eq '1' ]
then
        echo '11111'
elif [ $1 -eq '2' ]
then
        echo '2222'
fi
echo '结束if----->'
[root@izm5eac6bnsz8uq175jkvez tmp]# chmod u+x if.sh 
[root@izm5eac6bnsz8uq175jkvez tmp]# ./if.sh 2
开始if---->
2222
结束if----->

for

[root@izm5eac6bnsz8uq175jkvez tmp]# vim for.sh 
#!/bin/bash
echo '开始for循环--->'
a=0
for((i=0;i<=100;i++))
do
        s=$[$s+$i]
done
#或者使用's='$s
echo "s=$s"
echo '结束for循环--->'
[root@izm5eac6bnsz8uq175jkvez tmp]# chmod u+x for.sh 
[root@izm5eac6bnsz8uq175jkvez tmp]# ./for.sh 
开始for循环--->
s=5050
结束for循环--->

while

[root@izm5eac6bnsz8uq175jkvez tmp]# vim while.sh 
#!/bin/bash
echo '开始while循环---->'
s=0
i=1
while [ $i -le 100 ]
do
        s=$[$s+$i]
        i=$[$i+1]
done
echo "s=$s"
echo '结束while循环---->'
[root@izm5eac6bnsz8uq175jkvez tmp]# chmod u+x while.sh 
[root@izm5eac6bnsz8uq175jkvez tmp]# ./while.sh 
开始while循环---->
s=5050
结束while循环---->

case

[root@izm5eac6bnsz8uq175jkvez tmp]# vim case.sh
#!/bin/bash
echo '开始case----->'
case $1 in
'1')
        echo '1111'
;;
'2')
        echo '2222'
;;
'3')
        echo '3333'
;;
*)
        echo 'mygod---->'
;;
esac
echo '结束case----->'
[root@izm5eac6bnsz8uq175jkvez tmp]# chmod u+x case.sh 
[root@izm5eac6bnsz8uq175jkvez tmp]# ./case.sh 1
开始case----->
1111
结束case----->
[root@izm5eac6bnsz8uq175jkvez tmp]# ./case.sh 333
开始case----->
mygod---->
结束case----->

read读取控制台输入

read: read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]

命令 说明
-p 指定读取值时的提示符
-t 指定读取值时等待的时间(秒)
[root@izm5eac6bnsz8uq175jkvez tmp]# vim read.sh 
#!/bin/bash
echo '测试read----->'
read -t 7 -p 'Enter your name in 7 seconds' username
echo $username
echo '结束read----->'
[root@izm5eac6bnsz8uq175jkvez tmp]# chmod u+x read.sh 
[root@izm5eac6bnsz8uq175jkvez tmp]# ./read.sh
测试read----->
Enter your name in 7 seconds
结束read----->
[root@izm5eac6bnsz8uq175jkvez tmp]# ./read.sh
测试read----->
Enter your name in 7 seconds xiaobing
xiaobing
结束read----->

函数

系统自带函数

[root@izm5eac6bnsz8uq175jkvez tmp]# dirname /tmp/read.sh 
/tmp
[root@izm5eac6bnsz8uq175jkvez tmp]# base /tmp/read.sh 
-bash: base: command not found
[root@izm5eac6bnsz8uq175jkvez tmp]# basename /tmp/read.sh 
read.sh

自定义函数

测试一

[root@izm5eac6bnsz8uq175jkvez tmp]# vim function.sh
#!/bin/bash
echo '测试function开始------>'
function sum(){
    s=0
    s=$[ $1 + $2 ]
    echo "$s"
}

read -p "Please input the number1: " n1
read -p "Please input the number2: " n2
sum $n1 $n2
echo '测试function结束------>'
[root@izm5eac6bnsz8uq175jkvez tmp]# chmod u+x function.sh 
[root@izm5eac6bnsz8uq175jkvez tmp]# ./function.sh 
测试function开始------>
Please input the number1: 10
Please input the number2: 15
25
测试function结束------>

测试二

[root@izm5eac6bnsz8uq175jkvez tmp]# vim function2.sh 
#!/bin/bash
echo '测试function开始------>'
a=5
b=10
function sum(){
  echo "$[$a+$b]"
}
sum
echo '测试function结束------>'
[root@izm5eac6bnsz8uq175jkvez tmp]# chmod u+x function2.sh
[root@izm5eac6bnsz8uq175jkvez tmp]# ./function2.sh 
测试function开始------>
15
测试function结束------>