shell脚本基础

关于作者

周李杰,最后一批90后,现居湖北武汉

孤独患者,懒癌中期,无脑幻想者。但却人畜无害,无需远离。

兴趣众多,然无一精通。正努力成为一个有趣的人。

1
2
> print("👆以上是不完整的我") //请我吃大餐将会了解更多
>

[TOC]

shell脚本基础

变量详解

什么是变量

变量即是可以变化的量

变量的作用

  • 保存表达式运算的结果至内存,方便复用或更改
  • 若无变量而无需复用表达式运算的结果只能重新运算,耗时较长
  • 可以把变量理解为一个存储信息的容器

变量取名以及注意事项

  • 变量名应该做到见名知义

  • 变量名区分大小写

  • 变量名中有多个单词时有两种方式表示

    • 单词间使用下划线分隔(官方推荐)
    • 首单词小写,后面单词的首字母大写
  • 变量名只能是由下划线、数字、字母组成,不能是空格或者特殊字符(#?<.,$!&*^~)

  • 不能以中文做变量名

  • 不能是保留字

    • 1
      break  continue  elif  else  for  global  if  in  is   not  or   while

变量类型

  • 字符型
  • 数值型
    • 整数
    • 浮点数
  • 布尔型

变量操作

  • 设置变量
  • 引用变量
  • 撤销变量

简述三种引号的用法

`反引号 用于命令替换 反引号里面的命令取出来是它们的值

‘ 单引号 取本身,不完成命令替换

“ 双引号 实现命令替换,支持变量

切记单引号取出来是本身,

反引号和双引号取出来是他们的值

bash变量类型

  • 环境变量
  • 本地变量(局部变量)
  • 位置变量
  • 特殊变量(为bash内置,主要用来保存某些特殊数据的变量,也称之为系统变量)

下面介绍两种取除变量以及不取出变量的用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 用法一:取出变量的值
[root@140 ~]# a=5
[root@140 ~]# cat > abc << DOF
> $a
> bb
> cc
> DOF
[root@140 ~]# cat abc
5
bb
cc

# 用法二:不取除变量的值
[root@140 ~]# cat > abc << 'EOF'
> $a
> bb
> cc
> EOF
[root@140 ~]# cat abc
$a
bb
cc

本地变量

1
2
3
4
5
# 本地变量,作为当前shell的进程,对当前shell以外的其他shell进程,包括当前shell的父shell,子shell进程均无效
VAR_NAME=VALUE(值)

# 局部变量,作为当前代码段,多用于函数
local(局部) VAR_NAME=VALUE(值)

环境变量

1
2
# 作用域为当前shell进程及其子进程
export VAR_NAME=VALUE(值)

位置变量

1
2
$1$2$3,....       //用来引用脚本的参数
shift [num] //位置变量使用完以后退出,后面的参数向前推进
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@140 opt]# cat haah.sh 
#!/bin/bash

echo $1
echo ------------
echo $2
echo ------------
echo $3
echo ------------
[root@140 opt]# bash haah.sh 1 2 3
1
------------
2
------------
3
------------
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@140 opt]# cat huhu.sh 
#!/bin/bash

for i in $*;do
echo $1
echo -----------
shift 2
done
[root@140 opt]# bash huhu.sh 1 2 3 4 5 6
1
-----------
3
-----------
5
-----------

-----------

-----------

-----------

特殊变量

1
2
3
4
5
6
7
$#      //是传给脚本的参数个数
$0 //是脚本本身的名字
$! //是shell最后运行的后台Process的PID
$@ //是传给脚本的所有参数的列表
$* //是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
$$ //是脚本运行的当前进程ID号
$? //是显示上条命令的退出状态,0表示没有错误,其他表示有错误

bash中自带环境变量

  • PATH
1
2
[root@140 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
  • SHELL
1
2
[root@140 ~]# echo $SHELL
/bin/bash
  • UID
1
2
[root@140 ~]# echo $UID
0
  • HISTSIZE
1
2
[root@140 ~]# echo $HISTSIZE
1000
  • HOME
1
2
[root@140 ~]# echo $HOME
/root
  • PWD
1
2
[root@140 ~]# echo $PWD
/root
  • HISTFILE
1
2
[root@140 ~]# echo $HISTFILE
/root/.bash_history
  • PS1
1
2
[root@140 ~]# echo $PS1
[\u@\h \W]\$

只读变量

1
2
# 不能修改值,不能销毁,只能等shell进程终止时随之消亡
readonly(只读) VAR_NAME=VALUE(值)

脚本基础

什么是脚本

​ 脚本(script)是使用一种特定的描述性语言,依据一定的格式编写的可执行文件,又称作宏或批处理文件。脚本通常可以由应用程序临时调用并执行。

​ 脚本简单地说就是一条条的文字命令,这些文字命令是我们可以看到的(如可以用记事本打开查看、编辑),脚本程序在执行时,是由系统的一个解释器,将其一条条的翻译成机器可识别的指令,并按程序顺序执行。因为脚本在执行时多了一道翻译的过程,所以它比二进制程序执行效率要稍低一些。

程序反回值

程序执行以后有两类返回值:

  • 程序执行的结果
  • 程序状态返回代码(0-255)
    • 0:正确执行
    • 1-255:错误执行,1、2、127系统预留,有特殊意义

脚本测试

1
2
3
4
5
# 检查脚本是否有语法错误
bash -n scriptname

# 单步执行,检查脚本错在哪里(最常用)
bash -x scriptname

例如此处写个错误的脚本

1
2
3
root@140 opt]# bash -x huhu.sh 
huhu.sh:行3: 未预期的符号 `do' 附近有语法错误
huhu.sh:行3: `frr i in $*;do'

写脚本注意事项

  • 禁止将为成功执行的代码直接写入脚本
  • 脚本中的命令一定要用绝对路径

shell算术运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 变量
A=30
B=20

# A加上B
echo $[$A + $B]

# A减去B
echo $[$A - $B]

# A乘以B
echo $[$A * $B]

# A除以B
echo "scale=2;$A/$B"|bc

命令间的逻辑关系

1
2
3
4
# 逻辑与:&&
含义:当前一个命令执行成功后,再次执行后面的命令
# 逻辑非:||
含义:当前一个命令执行失败后,再次执行后面的命令

练习

1.写一个脚本,要求如下:

  • 设定变量Fa的值为/etc/passwd
  • 设定变量line的为$(cat $Fa | wc -l)
  • 依次向/etc/passwd中的每个用户问好,并且说出对方的ID是什么。结果输出如下:
    • Hello,root,your UID is 0.
  • 统计当前系统一个有多少个用户并输出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash

# 设置变量
Fa=/etc/passwd
line=$(cat $Fa | wc -l)

# 取出用户名以及UID
for ((i=1;i<=$line;i++));do
username=$(awk -F ':' -vi=$i "NR==$i {print $ 1}" $Fa)
user_uid=$(awk -F ':' -vi=$i "NR==$i {print $ 1}" $Fa)

# 给每个用户问好
echo "hello $username , your uid is $user_uid ."
done

# 统计用户
echo "Cuerrent system has $(cat $Fa | wc -l) user."

2.写一个脚本,传递两个整数给此脚本,让脚本分别计算并显示这两个整数的和,差,积,商

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@140 opt]# cat suanfa.sh
#!/bin/bash

# 变量
A=$1
B=$2

# A加上B
echo $A+$B=$[$A + $B]

# A减去B
echo $A-$B=$[$A - $B]

# A乘以B
echo $A*$B=$[$A * $B]

# 设置变量
chuyi=$(echo "scale=2;$A/$B"|bc)

# A除以B
echo $A/$B=$chuyi

[root@140 opt]# bash suanfa.sh 50 20
50+20=70
50-20=30
50*20=1000
50/20=2.50

3.写一个脚本,要求如下:

  • 创建目录/tmp/scripts
  • 切换至此目录中
  • 复制/etc/pam.d目录至当前目录,并重命名为test
  • 将当前目录的test及其里面的文件和子目录的属主改为redhat
  • 将test及其子目录中的文件的其它用户的权限改为没有任何权限
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@140 opt]# cat mulu.sh 
#!/bin/bash

#设置变量
mkdir=/usr/bin/mkdir
cd=/usr/bin/cd
cp=/usr/bin/cp
chown=/usr/bin/chown
chmod=/usr/bin/chmod
useradd=/usr/bin/useradd
# 一条命令解决
mkdir /tmp/scripts && cd /tmp/scripts && cp -rf /etc/pam.d ./test && chown -Rf redhat: test || useradd redhat && chmod -Rf o-rwx test

[root@140 opt]# bash -x mulu.sh
+ mkdir=/usr/bin/mkdir
+ cd=/usr/bin/cd
+ cp=/usr/bin/cp
+ chown=/usr/bin/chown
+ chmod=/usr/bin/chmod
+ useradd=/usr/bin/useradd
+ mkdir /tmp/scripts
+ cd /tmp/scripts
+ cp -rf /etc/pam.d ./test
+ chown -Rf redhat: test
+ chmod -Rf o-rwx test

4.写一个脚本,要求如下:

  • 显示当前系统日期和时间,而后创建目录/tmp/lstest
  • 切换工作目录至/tmp/lstest
  • 创建目录a1d,b56e,6test
  • 创建空文件xy,x2y,732
  • 列出当前目录下以a,x或者6开头的文件或目录
  • 列出当前目录下以字母开头,后跟一个任意数字,而后跟任意长度字符的文件或目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
[root@140 opt]# cat shijian.sh 
#!/bin/bash

# 设置变量
date=/usr/bin/date
mkdir=/usr/bin/mkdir
cd=/usr/bin/cd
touch=/usr/bin/touch
ls=/usr/bin/ls


date && mkdir /tmp/lstest && cd /tmp/lstest && mkdir a1d b56e 6test && touch xy x2y 732 && ls a* x* 6* && ls [a-z][0-9]*
[root@140 opt]# bash -x shijian.sh
+ date=/usr/bin/date
+ mkdir=/usr/bin/mkdir
+ cd=/usr/bin/cd
+ touch=/usr/bin/touch
+ ls=/usr/bin/ls
+ date
2019年 05月 21日 星期二 22:11:10 CST
+ mkdir /tmp/lstest
+ cd /tmp/lstest
+ mkdir a1d b56e 6test
+ touch xy x2y 732
+ ls a1d x2y xy 6test
x2y xy

6test:

a1d:
+ ls a1d b56e x2y
x2y

a1d:

b56e:
打赏
  • © 2019-2020 Li Jie
  • Powered by Hexo Theme Ayer
    • PV:
    • UV:

喜欢就打赏吧~

支付宝
微信