Shell编程-浅谈(一)
一、Shell简介
Shell是一种具备特殊功能的程序,它提供了用户与内核进行交互操作的一种接口
它接收用户输入的命令,并把它送入内核去执行
内核是Linux系统的心脏,从开机自检就驻留在计算机的内存中,直到计算机关闭为止,而用户的应用程序存储在计算机的硬盘上,仅当需要时才被调入内存
Shell是一种应用程序,当用户登录Linux系统时,Shell就会被调入内存去执行
Shell独立于内核,它是连接内核和应用程序的桥梁,并由输入设备读取命令,再将其转为计算机可以理解的机械码,Linux内核才能执行该命令
二、Shell脚本
Shell 脚本(shell script),是一种为 shell 编写的脚本程序
业界所说的 shell 通常都是指 shell 脚本,但shell 和 shell script 是两个不同的概念
三、Shell环境
Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了
Linux 的 Shell 种类众多,常见的有:
Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh)
四、第一个简单的Shell脚本
打开文本编辑器(可以使用 vi/vim 命令来创建文件),新建一个文件 test.sh,扩展名为 sh(sh代表shell),扩展名并不影响脚本执行
输入一些代码,第一行一般是这样:
#!/bin/bash
echo "Hello World
第一行指定解释器,第二行打印 Hello world!
写好后,开始执行,执行 Shell 脚本有三种方法:
方法 1:直接用 bash 解释器执行
#bash test.sh
Hello world!
方法 2:添加可执行权限
#ll test.sh
-rw-r–r--. 1 root root 32 Aug 18 01:07 test.sh
#chmod +x test.sh
#./test.sh
-bash: ./test.sh: Permission denied
#chmod +x test.sh
#./test.sh # ./在当前目录
Hello world!
方法 3:source 命令执行,以当前默认 Shell 解释器执行
#source test.sh
Hello world!
五、Shell 变量
5.1 系统变量
在命令行提示符直接执行 env、set 查看系统或环境变量。env 显示用户环境变量,set 显示 Shell预先定义好的变量以及用户变量。可以通过 export 导出成用户变量
一些写 Shell 脚本时常用的系统变量:
$SHELL 默认 Shell
$HOME 当前用户家目录
$IFS 内部字段分隔符
$LANG 默认语言
$PATH 默认可执行程序路径
$PWD 当前目录
$UID 当前用户 ID
$USER 当前用户
$HISTSIZE 历史命令大小,可通过 HISTTIMEFORMAT 变量设置命令执行时间
$RANDOM 随机生成一个 0 至 32767 的整数
$HOSTNAME 主机名
5.2 普通变量与临时环境变量
普通变量定义:VAR=value
临时环境变量定义:export VAR=value
变量引用:$VAR
需要注意的是退出终端后,所有用户定义的变量都会清除
5.3 位置变量
位置变量指的是函数或脚本后跟的第 n 个参数
1−n,需要注意的是从第 10 个开始要用花括号调用,例如${10}
shift 可对位置变量控制
例如:
#!/bin/bash
echo "1: $1"
shift
echo "2: $2"
shift
echo "3: $3"
#bash test.sh a b c
1: a
2: c
3:
每执行一次 shift 命令,位置变量个数就会减一
而变量值则提前一位。shift n,可设置向前移动n位
5.4 变量引用
赋值运算符
=
变量赋值
+=
两个变量相加
5.5 自定义变量与引用
#VAR=123
#echo $VAR
123
#VAR+=456
#echo $VAR
123456
Shell 中所有变量引用使用 $ 符,后跟变量名
有时个别特殊字符会影响正常引用,那么需要使用${VAR},例如:
#VAR=123
#echo $VAR
123
#echo $VAR_ # Shell 允许 VAR_为变量名,所以此引用认为这是一个有效的变量名,故此返回空
#echo ${VAR}
123
还有时候变量名与其他字符串紧碍着,也会误认为是整个变量
#echo $VAR456
#echo ${VAR}456
123456
5.6 将命令结果作为变量值
#VAR=`echo 123`
#echo $VAR
123
#VAR=$(echo 123)
#echo $VAR
123
这里的反撇号等效于$(),都是用于执行 Shell 命令
5.7 双引号和单引号
在变量赋值时,如果值有空格,Shell 会把空格后面的字符串解释为命令
#VAR=1 2 3
-bash: 2: command not found
#VAR="1 2 3"
#echo $VAR
1 2 3
#VAR='1 2 3'
#echo $VAR
1 2 3
看不出什么区别,再举个说明
#N=3
#VAR="1 2 $N"
#echo $VAR
1 2 3
#VAR='1 2 $N'
#echo $VAR
1 2 $N