bash脚本基础2
bash脚本基础
bash特性:
命令行展开: ~, {}
命令别名: alias , unalias
命令历史: history
文件名通配: glob
快捷键: Ctrl+a, e, u, k, l
命令补全: $PATH
路径补全
bash特性之: 命令hash
记住外部命令的位置
缓存此前的命令查找结果: key-value形式存储的.
hash -d COMMAND: 删除指定命令
hash -r: 清除hash表
[root@localhost ~]# hash hits command 1 /usr/sbin/service 1 /usr/bin/vim 2 /usr/bin/ping [root@localhost ~]# type hash hash is a shell builtin
bash特性之: 变量
程序: 指令+数据组成
指令: 由程序文件提供
数据: 可以通过标准输入获取(IO设备), 文件, 管道(类文件), 变量
程序: 算法+数据结构
变量名: 指向内存空间(命名的内存)
变量赋值: name=value
变量类型: 存储格式, 数据类型
编程语言:
强类型语言
弱类型语言:
bash把所有变量视作字符类型
bash中的变量无需事先声明
变量替换: 把变量名出线的位置替换为其内存空间所指向的数据
变量引用: $(var_name), $var_name
变量名: 只能数字, 字母, 下划线, 不能以数字开头
变量名: 见名知意, 同一用某种法则
bash变量类型:
本地变量: 作用域范围仅为当前shell进程
环境变量: 作用域为当前shell进程及其子进程
局部变量: 作用域仅为某代码片段(函数的上下文)
位置参数变量: 向执行脚本的shell进程传递的参数
特殊变量: shell内置的有特殊功能的变量
eg:
$?: 表示上一个命令的执行结果
0: 成功
1-255: 失败
本地变量:
变量赋值: name=value
变量引用: $(name), $name
"": 变量名会替换为其值
'': 强引用, 不会替换其值
查看变量: set
撤销变量: unset name 不要$
环境变量:
变量赋值:
(1): export name=value
(2): name=value
export name
(3): declare -x name=value
(4): name=value
declare -x name
不要与bash自带的关键环境变量(用于定义bash的工作环境)重名:
PATH, HISTFILE, HISTSIZE, HISTFILESIZE, HISTCONTRAL, SHELL, HOME, UID, PWD...
查看环境变量的命令: export, declare -x, printenv, env
撤销环境变量: unset name
只读变量(常量):
declare -r name
readonly $name
只读变量无法重新赋值, 并且不支持撤销, 存活时间为当前shell进程的生命周期
bash特性之多命令执行:
COMMAND1; COMMAND2; COMMAND3... 以分号分隔
逻辑运算:
运算数: 真(true, yes, on, 1)
假(false, no, off, 0)
逻辑运算符:
与, 或, 非, 异或
&&, ||, !, ^
短路法则:
COMMAND1 && COMMAND2, 只有前一个命令成功之后, 才会执行后一个命令
COMMAND1 || COMMAND2, 只有第一个命令为"假", 才会执行后一个命令
如果用户不存在, 则创建用户
[root@localhost ~]# id user1 || useradd user1 id: user1: no such user
shell 脚本编程:
过程式编程, 解释运行, 依赖于外部程序文件运行
如何写shell脚本?
脚本文件的第一行, 顶格: 给出shebang, 解释器路径, 用于指明解释执行当前脚本的解释器程序文件.
常见的解释器:
#!/bin/bash
#!/user/bin/python
#!/usr/bin/perl
shell脚本是什么?
命令的堆砌
许多的命令都不具有幂等性(即可以重复的运行), 所以需要添加判断, 来防止程序出错.
bash的配置文件:
两类:
profile类: 为交互式登录的shell进程提供配置
bashrc类: 为非交互式登录的shell进程提供配置
登录类型:
交互式登录shell进程:
直接通过某终端输入账号和密码登录打开的shell进程
使用su命令: su - USERNAME, 或者使用 su - USERNAME 执行的登录切换功能
非交互式登录的shell进程 :
su USERNAME
图形界面下打开的终端
运行脚本(shell脚本是在一个子shell进程运行实现的)
profile类:
全局: 对所有用户都生效:
/etc/profile
/etc/profile.d/*.sh
用户个人: 仅对当前用户有效
~/.bash_profile
功用:
1. 用于环境变量
2. 运行命令或脚本
bashrc类:
全局:
/etc/bashrc
用户个人:
~/.bashrc
功用:
1. 定义本地变量
2. 定义命令别名
注意: 仅管理员可修改全局配置文件
读取顺序:
交互式登录shell进程:
/etc/profile --> /etc/profile.d/* --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非交互式登录shell进程:
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*
命令行的定义的特性, 例如变量和别名作用域为当前shell进程 的生命周期
配置文件定义的特性, 只对随后新启动的shell进程有效
让通过配置文件定义的特性立即生效:
(1): 通过命令行重复定义一次
(2): 让shell进程重读配置文件
source /PATH/CONF_FILE
. /PATH/CONF_FILE
bash算数运算
+ - * / ** %
算数运算符格式:
(1) let var=算数运算符表达式
(2) var=$(算数运算符表达式)
(3) var=$((算数运算符表达式))
(4) var=$(expr $ARG1 $OP $ARG2)
[root@localhost ~]# declare -i n2=5 [root@localhost ~]# declare -i n1=4 [root@localhost ~]# let res=$n1+$n2 [root@localhost ~]# echo res res [root@localhost ~]# echo $res 9 [root@localhost ~]# echo $[$n1+$n2] 9 [root@localhost ~]# echo $(($n1+$n2)) 9 [root@localhost ~]# echo $(expr $n1 + $n2) 9

浙公网安备 33010602011771号