shell脚本了解

2020-09-14  本文已影响0人  WhiteStruggle

[toc]

shell版本

擅长处理纯文本类型的数据

弱类型语言

通用的标准 Bourne shell (sh)C shell (csh) ,其中 Bourne shell (sh)bash shell 取代

优势: 在于处理操作系统底层业务(大量的命令)

shell种类

Bourne shell (sh)
Korn shell (ksh)
Bourne Again shell (bash)
POSIX shell (sh)
C shell (csh)
TENEX/TOPS C shell (tcsh)

常见操作系统的默认shell

查看linux系统默认的shell:

方法一:
root@ubuntu:~# echo $SHELL
/bin/bash
方法二:
root@ubuntu:~# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
nm-openvpn:x:117:125:NetworkManager OpenVPN,,,:/var/lib/openvpn/chroot:/usr/sbin/nologin

shell脚本的建立和执行

使用编辑器 vi/vim 编辑器

脚本开头

#!/bin/bash   标准写法
或
#!/bin/sh

#! 称为 幻数,在执行 bash 脚本时,内核会确定用什么解释脚本的内容,必须在脚本的第一行,否则会被解释为 注释

Linux中常见脚本开头的编码语法:

#!/bin/sh
#!/bin/bash
#!/bin/sed          # sed 脚本
#!/usr/bin/awk      # awk 语言
#!/usr/bin/env python # python 语言
#!/usr/bin/expect
#!/usr/bin/perl
#!/usr/bin/tel

若脚本开头不指定解释器,则需要对应的解释器来执行脚本

脚本注释

shell脚本 中 井号(#) 后面的内容都是注释的内容

bash 与 dash

Debian和Ubuntu中,/bin/sh默认已经指向dash,是一个不同于bash的shell,它主要是为了执行脚本而出现,而不是交互,它速度更快,但功能相比bash要少很多,语法严格遵守POSIX标准

root@ubuntu:~# ls -l /bin/sh
lrwxrwxrwx 1 root root 4 11月 12  2019 /bin/sh -> dash

root@ubuntu:~# ll /bin/sh
lrwxrwxrwx 1 root root 4 11月 12  2019 /bin/sh -> dash*

dash解释器可能会使得一些bash语法写的shell 脚本不能运行

切换默认的 /bin/sh 指向 bash

root@ubuntu:~# sudo dpkg-reconfigure dash

弹出界面修改,询问你是否使用dash作为默认的 /bin/sh

修改的话就选择: 否 

修改之后查看

root@ubuntu:~# ls -l /bin/sh
lrwxrwxrwx 1 root root 4 7月  25 11:04 /bin/sh -> bash

脚本的执行

shell 脚本是 以 非交互的方式运行时,先查找环境变量( ENV ),该变量指定了一个环境文件( .bashrc) ,然后改环境变量文件开始执行,读取env文件后,开始执行shell脚本内容

linux 环境下的 /etc/profile 存放至全局的环境变量文件

若文件定义的变量放在etc/profile.d/目录中,会默认为环境变量

查看用户的环境变量:

ll /home/yz-0127/ -al

shell脚本的执行通常可以采用的方式:

  1. bash 脚本全路径sh 脚本全路径

当脚本文件本身没有可执行权限,或者文件开头没有指定解释器

yz-0127@ubuntu:~$ bash /mysh/demo.sh
hello World!
  1. 脚本全路径
yz-0127@ubuntu:~$ /mysh/demo.sh
hello World!
  1. source 脚本全路径. 脚本全路径
yz-0127@ubuntu:~$ source /mysh/demo.sh
hello World!

注意:利用tab补全路径,当不能补全时,说明没有文件的权限

反引号( ` ` ) 会解释 一些命令

source和.与其他方式的区别

source. 相当于 PHP 中的 include ,引入其他脚本的文件

root@ubuntu:~# cat 5.sh
#!/bin/bash
user=`whoami`
root@ubuntu:~# bash 5.sh
root@ubuntu:~# echo $user

root@ubuntu:~# source 5.sh
root@ubuntu:~# echo $user
root
root@ubuntu:~# 

基本规范

  1. 开头指定脚本解释器
#!/bin/bash
  1. 开头加上版本版权等信息
# Date :更新时间
# Author : 作者
# Mail: 邮箱
# Function : 脚本功能
# Version  : 版本

可以配置vim编辑文件时自动加上信息,方法时 修改 /.vimrc 配置文件

  1. 脚本中尽量不要用中文,注释也用英文标识

linux对中文支持不好

  1. 扩展名 .sh
  1. 中括号[] 两端要有空格
[ yz ]
  1. 流程控制语句 一次性完成轮廓,然后再书写具体内容
  1. 通过缩进使代码更易读

变量基础及深入

分类:

局部变量只能在创建他们的shell函数或脚本中使用

环境变量也称全局变量,可以在创建他们的shell函数 及其 派生出来的任意子进程shell中使用

存在着一些专用的shell变量

环境变量

环境变量可以在命令行中设置,但档用户退出时,这些变量值就会丢失,因此最好在用户 /home 目录下 的 .bash_profile 文件中或 全局配置 /etc/bash.bashrc /etc/profile 文件 或 /etc/profile.d/ 中定义

系统在加载过程中,会把先把全部的全局变量加载

将环境变量方如 profile 文件中,每次用户登录时这些变量都会被初始化

例如:

root@ubuntu:~# echo $HOME
/root
root@ubuntu:~# echo $USER
root
root@ubuntu:~# echo $uid

root@ubuntu:~# echo $UID
root@ubuntu:~# echo $UID
0
root@ubuntu:~# echo $SHELL
/bin/bash

设置环境变量

在给变量赋值之后或设置变量时使用 export 命令

或者 带 -x 选项的 declare 内置命令

注意 : 输出变量时候不能再变量名前加 $

格式:

(1) export 变量名 = value
(2) 变量名 = value : export 变量名
(3) declare -x 变量名 = value

自定义环境变量,在生产环境中需要一些配置文件,例如 java环境配置实例

一般的配置环境变量放在 /etc/profile`

取消环境变量

显示默认的环境变量:

root@ubuntu:~# env
root@ubuntu:~# printenv
root@ubuntu:~# set

unset 取消 本地变量和环境变量

root@ubuntu:~# echo $USER
root
root@ubuntu:~# unset USER
root@ubuntu:~# echo $USER

root@ubuntu:~# 

unset 取消变量,退出用户,再次登录还是会存在,想要彻底取消,需要书写的配置文件中

局部变量(本地变量)

本地变量在用户当前的shell生存期的脚本中使用

当在shell中启动另一个进程或退出,本地变量就会失效

定义方法:

变量名 = value

用于:直接定义变量的内容,内容一般为简单连续的数字、字符串、路径名等

a = 33
b = yes
变量名 = 'value'

单引号定义变量 , 内容中是什么就会输出什么,变量不会被解析
用于:定义显示纯字符串

a = 'WRONG'
变量名 = "value"

双引号定义变量
用于:字符串中附带有变量的内容的定义

a = "this is wrong"

例如:

root@ubuntu:~# a=192.168.1.2
root@ubuntu:~# b='193.168.1.2'
root@ubuntu:~# c="194.168.1.2"
root@ubuntu:~# echo "a=$a"
a=192.168.1.2
root@ubuntu:~# echo "b=$b"
b=193.168.1.2
root@ubuntu:~# echo "c=${c}"
c=194.168.1.2
root@ubuntu:~# 

单引号'' 不会解析其内容

root@ubuntu:~# echo 'a=$a'
a=$a

命名规范:

  1. 变量命名要统一,使用大写字母
  2. 予以要清晰,能够表达变量内容的含义
  3. 过长的单词使用 单词前几个字母 代替
  4. 多个单词连接使用 "_" 连接
  5. 避免无含义的字符或数字
  6. 使用变量时,采用大括号,会比较清晰
  7. 字符串变量通常用双引号括起来,减少怪异的错误

局部变量规范:

使用local定义变量,代表只在脚本中的函数体生效

local a;

把命令定义为变量

  1. 利用 反引号( `` ) ,定义变量
root@ubuntu:~# time=`date +%F`
root@ubuntu:~# echo $time
2020-07-29
  1. 利用小括号,定义变量 (常用)
root@ubuntu:~# time=$(date +%F)
root@ubuntu:~# echo $time
2020-07-29
上一篇下一篇

猜你喜欢

热点阅读