shell脚本

shell是一个命令行解释器,他接收应用程序/用户命令,然后条用操作系统内核。

shell是功能强大的编程语言,易编写、易调试,灵活性强。

shell脚本入门

1.脚本格式

脚本以#!/bin/bash 开头,指定解析器。

2.

touch batch.sh

#!/bin/bash

cd /home/lmx
touch banzhang.txt
echo "yuanlin 520 happy" >>banzhang.txt

bash batch.sh

3.变量

3.1 常用系统变量 $HOME $PWD(当前路径) $SHELL $USER

(base) studieren@studieren-GS65-Stealth-Thin-8RE:~$ echo $HOME
/home/studieren
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~$ echo $PWD
/home/studieren
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~$ echo $SHELL
/bin/bash
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~$ echo $USER
studieren

3.2 自定义变量

(1)基本语法:定义变量: 变量=值  等号两边没有空格

(2) 撤销变量:unset变量

(base) studieren@studieren-GS65-Stealth-Thin-8RE:~$ A=1
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~$ echo $A
1
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~$ A=2
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~$ echo $A
2
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~$ unset A
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~$ echo $A

(base) studieren@studieren-GS65-Stealth-Thin-8RE:~$ 

(3)声明静态变量:readonly变量,不能unset。重新启动才能取消。

(base) studieren@studieren-GS65-Stealth-Thin-8RE:~$ readonly B=3
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~$ echo $B
3
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~$ unset B
bash: unset: B: 无法取消设定: 只读 variable

3.3 命令规则

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

(2)等号两侧不能有空格。

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

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

(base) studieren@studieren-GS65-Stealth-Thin-8RE:~$ C=1+1
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~$ echo $C
1+1


(base) studieren@studieren-GS65-Stealth-Thin-8RE:~$ D=wo ai ni
ai:未找到命令
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~$ echo $D

(base) studieren@studieren-GS65-Stealth-Thin-8RE:~$ D="WO AI NI"
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~$ echo $D
WO AI NI
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~$ 

3.4 可把变量提升为全局环境变量,可供其他shell程序使用。

(base) studieren@studieren-GS65-Stealth-Thin-8RE:~$ echo $D
WO AI NI
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ bash helloworld.sh 
520 yuanlinkuaile!

(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ export D
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ bash helloworld.sh 
520 yuanlinkuaile!
WO AI NI

3.5 特殊变量

(1)$n

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

helloword.sh

#!/bin/bash
echo "520 yuanlinkuaile!"
echo $D
echo "$0 $1 $2 $3"
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ bash helloworld.sh 
520 yuanlinkuaile!
WO AI NI
helloworld.sh   
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ bash helloworld.sh a b c
520 yuanlinkuaile!
WO AI NI
helloworld.sh a b c

(2) $# 获取所有输入参数个数,常用于循环。

echo $#



(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ bash helloworld.sh a b c
520 yuanlinkuaile!
WO AI NI
helloworld.sh a b c
3
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ bash helloworld.sh a b c d
520 yuanlinkuaile!
WO AI NI
helloworld.sh a b c
4

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

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

$*
$@

(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ bash helloworld.sh a b c d
520 yuanlinkuaile!
WO AI NI
helloworld.sh a b c
4
a b c d
a b c d

(4)$? 最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行,如果这个变量的值为非0,则证明上一个命令执行不正确

(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ bash helloworld.sh a b c d
520 yuanlinkuaile!
WO AI NI
helloworld.sh a b c
4
a b c d
a b c d
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ echo $?
0

4.运算符

4.1基本语法

“$((运算式))”   或者“[运算符]”

expr + - \* \ %

(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ expr 3 + 2
5
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ expr `expr 2 + 3` \* 4
20
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ s=$[(2+3)*4]
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ echo $s
20

5. 条件判断

5.1 基本语法

[ condition ]  有两个空格

注意:条件非空即为true,[] 返回false

5.2 常用判断条件

(1)两个整数之间的比较

= 字符串比较; -lt less than 小于;  le less equal 小于等于;

-eq equal 等于; -gt gtreater than 大于; -ge greater equal 大于等于

-ne 不等于 not equal

(2)按照文件权限进行判断

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

(3)按照文件类型进行判断

-f 文件存在且是一个常规的文件(file)     -d 文件存在并是一个目录(directory)

-e 文件存在

(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ [ 23 -ge 22 ]
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ echo $?
0
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ [ 23 -le 22 ]
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ echo $?
1
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ [ -w helloworld.sh ]
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ echo $?
0
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ [ -e helloworld.sh ]
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ echo $?
0
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ [ -f helloworld.sh ]
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ echo $?
0
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ [ -d helloworld.sh ]
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ echo $?
1

5.3 多条件判断

&&表示前一条命令执行成功时,才执行后一条命令 ||表示上一条命令执行失败后,才执行下一条命令。

(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ [ 1 -gt 0 ] && echo ok || echo not ok
ok

6 流程控制(Important)

6.1 if判断
 

if [ 条件判断式 ];then

  程序

fi

或者
if [ 条件判断式 ]
  then
       程序
fi

注意事项:

[ 条件判断式 ],中括号和条件判断式之间必须要有空格。

if后要有空格

#!/bin/bash
if [ $1 -eq 1 ];then
  echo "banzhang zhen shuai"
elif [ $1 -eq 2 ];then
  echo "cls zhen mei"
fi
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ bash lala.sh 1
banzhang zhen shuai
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ bash lala.sh 2
cls zhen mei
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ bash lala.sh 3
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ 

6.2 case语句

6.2.1 case $变量名 in

#!/bin/bash
case $1 in
1)
    echo "banzhang zhen shuai"
;;
2)
    echo "cls zhen shuai"
;;
*) 
    echo "renyao"
;;
esac
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ bash case.sh 1
banzhang zhen shuai
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ bash case.sh 2
cls zhen shuai
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ bash case.sh 3
renyao
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ bash case.sh 4
renyao

6.3 for循环1

#!/bin/bash
s=0
for((i=1;i<=100;i++))
do 
       s=$[$s+$i]
done
echo $s
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ bash for.sh
5050

6.4 for循环2

#!/bin/bash

for i in $*
do
  echo "banzhang xihuan $i"
done

for j in $@
do
  echo "banzhang xihuan $j"
done
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ bash for2.sh lm lmm
banzhang xihuan lm
banzhang xihuan lmm
banzhang xihuan lm
banzhang xihuan lmm

#!/bin/bash

for i in "$*"
do
  echo "banzhang xihuan $i"
done

for j in "$@"
do
  echo "banzhang xihuan $j"
done
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ bash for2.sh lm lmm
banzhang xihuan lm lmm
banzhang xihuan lm
banzhang xihuan lmm

6.5 while

while [ 条件判断式 ]

do

程序

done

#!/bin/bash

i=1
s=0
while [ $i -le 100 ]

do 
  s=$[$s+$i]
  i=$[$i+1]
done
echo $s
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ bash while.sh 
5050

7 read读取控制台输入

#!/bin/bash

read -t 7 -p "input you name: " NAME
echo $NAME
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ bash read.sh 
input you name: lmx
lmx

8 函数

8.1 系统函数

8.1.1basename基本语法(获取不带路径和文件后缀的文件名)

basename [string / pathname] [suffix]  basename命令会删掉所有的前缀包括最后一个('/')字符,然后将字符串显示出来。

suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。

(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ basename /home/studieren/shell_lmx/while.sh
while.sh
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ basename /home/studieren/shell_lmx/while.sh .sh
while

8.1.2 dirname基本语法

从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录部分)

(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ dirname /home/studieren/shell_lmx/while.sh
/home/studieren/shell_lmx

8.2 自定义函数

#!/bin/bash
function sum()
{
  s=0;
  s=$[$1+$2]
  echo $s
}

read -p "input your parameter1:" P1
read -p "input your parameter2:" P2

sum $P1 $P2
(base) studieren@studieren-GS65-Stealth-Thin-8RE:~/shell_lmx$ bash sum.sh
input your parameter1:1
input your parameter2:2
3


版权声明:本文为qq_40297851原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。