LInux Shell程序设计
将指定路径加到环境变量$PATH
PATH=$PATH:绝对路径
export PATH
一、变量
1.用户定义的变量
- 给变量赋值时,等号左右不能有空格
- $:访问变量
a=33
echo $a
只读变量
readonly a
公共变量
export a
显示变量
echo $a
清除变量
- set : 显示所有本地定义的变量
unset a
2.shell定义的变量
- 所有环境变量均为大写
设置环境变量
TEMPVAR=123
export TEMPVAR
显示环境变量
- 查看所有环境变量
env
清除环境变量
unset TEMPVAR
常用的shell环境变量
环境变量 | 含义 |
---|---|
HOME | 保存注册用户主目录的绝对路径名 |
PATH | 保存路径(冒号分隔) |
TERM | 终端类型 |
UID | 当前用户标识符 |
PWD | 当前工作目录的绝对路径 |
PS1 | 主提示符 特权用户:# 普通用户:$ |
PS2 | 辅助提示符:> |
IFS | 缺省域分隔符 空格、tab |
LOGNAME | 保存登录名 |
SHELL | 保存缺省shell /etc/passwd中设置 |
3.位置参数
$1:shell取第一个参数 从1开始
$0:表示当前执行shell程序名(不是位置参数)
4.预定义变量
- 不能重定义
预定义变量 | 含义 |
---|---|
$0 | 当前执行的进程名 |
$# | 位置参数的数量 |
$* | 所有位置参数的内容 |
$? | 命令执行后返回的状态 0:成功 1:失败 |
$$ | 当前进程的进程号 |
$! | 后台运行的最后一个进程号 |
5.参数置换的变量
- 中间没有空格
- shell中不能为位置参数赋值
a=${b-200}
如果参数b有值则a=b,否则a=200
a=${b=200}
如果参数b有值则a=b,否则a=200,b=200
a=${b?info}
如果参数b有值则a=b,否则显示 info并退出,如果Info缺省则显示标准信息
a=${b+200}
如果参数b有值,则a=200,否则不置换
二、shell中的引用
1.双引号 “”
- 不能消除 $ ,\ ,"",反引号`四种
2.单引号 ‘’
- 消除单引号里面所有特殊字符的含义
3.反引号 `
- 反引号里的内容作为系统命令
- 输出变量为命令执行的结果
4.反斜杠 \
- 屏蔽特殊含义
三、Shell脚本
- 第一行:#!/bin/bash ——使用bshell解释器
- 第二行:脚本名称
- 注释:#
1.eval
- eval args :将args组合成一个命令执行
2.exec
- 执行完退出进程
3.export
- 变量可以带到子shell
4.readonly
- 将shell变量标识为不可变
5.read
- 从标准输入设备读入一行,分解成若干字,赋值给shell程序内部定义的变量。
6.shift
- 在程序中每使用一次shift语句,都使所有的位置参数依次向左移动一个位置,并使位置参数“$#”减1,直到减到0。
7.wait
- shell等待在后台启动的所有子进程结束。wait的返回值总是真。
8.exit
- 退出shell程序
9.source(等价于.)
- 在当前shell环境下读入指定的shell程序文件并依次执行文件中的所有语句。
- source 文件名(可以不拥有可执行权限)
10.":"空命令
- 通常放在行的最左边,实际不作任何命令,只返回出口代码0
四、程序流程控制
1.测试命令
1. test "abc" = "def" #注意等号左右空格
2. [ "abc" = "def" ] #注意等号,括号左右空格
[ -z $HOME ] #真为0
=,!=,>,<
-z(字符串是否为空) 1:非空
-n(字符串是否非空)
文件测试
-e 文件名 :如果文件存在则为真
-r 文件名 :如果文件存在且可读则为真
-w 文件名 :如果文件存在且可写则为真
-x 文件名 :如果文件存在且可执行则为真
-s 文件名 :如果文件存在且非空则为真
-d 文件名 :如果文件存在且为目录则为真
-f 文件名 :如果文件存在且为普通文件则为真
-c 文件名 :如果文件存在且为字符型特殊文件则为真
-b 文件名 :如果文件存在且为块特殊文件则为真
逻辑操作符:
-a :逻辑与,操作符两边均为真,结果为真,否则为假。
-o :逻辑或,操作符两边一边为真,结果为真,否则为假。
! :逻辑否,条件为假,结果为真。
混合命令条件执行
使用&&:command1 && command2,这种命令执行方式相当地直接。&&左边的命令(command1)返回真(即返回0,成功被执行)后,&&右边的命令(command2)才能够被执行;
使用||:command1 || command2,||的作用有一些不同。如果||左边的命令(command1)未执行成功,那么就执行||右边的命令(command2);或者换句话说,“如果这个命令执行失败了|| 那么就执行这个命令”>
command1 && command2 && command3,当command1, command2成功时才执行command3 >
command1 && command2 || comamnd3,仅当command1成功,command2失败时才执行command3
2.流控制
两个(())表示执行c语言代码
2.1 if
if 条件1
then 命令1
elif 条件2
then 命令2
else 命令3
fi
- if语句必须以单词fi
- 必须将then部分放在新行
#!/bin/bash
var=$1
if [ $var \< "9" ]
then
echo "less than 9"
else
echo "more than 9"
fi