脚本
用户判断
#!/bin/bash
id user1 &> /dev/null && echo "user1 exists." || useradd user1
id user1
如果user1有 则echo 否则建立用户
#!/bin/bash
w | grep "^root\>" &> /dev/null && echo "root logged" || echo "root is not logged"
egrep及扩展的正则表达式
egrep = grep -E
基名 basename /path/.../basename
就是最后一个名字(路径)
dirname 目录名字
grep -E ^(a|b|c)\>'' /etc/passwd
grep -E -o "^[_[:alpha:]+\(\)]" /etc/passwd
echo "/mnt/sdc" | grep -E "[^/]+/?$" |cut -d "/" -f1
要过滤基名 除了斜线外的内容后面至少出现一次字符,而且最后一个斜线可有可无
也可在现实中去掉斜线
fgrep 不支持正则表达式搜索
chmod +x name.sh
变量类型
数据存储格式 存储空间大小 参与运算种类
强类型:定义变量时必须指定类型、参与运算必须符合类型要求
弱类型:无需指定类型,默认均为字符型;参与运算会自动进行隐式类型转换
bash是弱类型
a=3
b=4
echo "$a+$b" 显示3+4
bash中变量的生效范围等标准
本地变量:生效范围为当前shell进程,对其他或者自己的子shell也无效
环境变量:生效范围当前shell进程及子进程
局部变量:范围为当前shell进程中某代码的片段(通常指函数)
位置变量:$1 $2 ..来表示 用于脚本在脚本中通过调用命令行传递给他的参数
特殊变量:$?(能否运行成功) $0(表示命令本身,也是一个位置变量)
$# $@ $*
本地变量
赋值name="value" '' 弱引用 强引用
name="$value"
name=`COMMAND`或者 name=$(COMMAND) 执行后的结果
引用${name} $name
""弱引用:变量引用会被替换为变量值
''强引用:变量引用不会被替换为变量值,而保持原字符串
``命令引用
显示已经定义的所有变量 set
unset name 销毁变量
环境变量
变量声明、赋值
expor name=VALUE
declare -x name=VALUE
变量引用 $name ${name}
显示所有环境变量
export
env
printenv
销毁
unset name
bash内键的环境变量
PATH SHELL UID HISTSIZE HOME PWD OLD HISTFILE PS1
变量命名法则
1不能用if for
2只能只用数字、字母、下划线,不能以数字开头
3最好见名知义 total_size
只读变量
readonly name
declare -r name
位置变量
在脚本代码中调用用过命令行传递给脚本的参数
$1 $2 对应第1 2个参数
$0 命令本身
$* 传递给脚本的所有参数
$@ 传递给脚本的所有参数
$# 传递给脚本的参数的个数
换岗 shift 踢掉一个输入的命令 shift n 踢掉n个
bash配置文件
全局配置
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
个人配置
~/.bash_profile
~/.bashrc
测试命令
test EXPRESSION
[[EXPRESSION]]
数值测试
是否
-gt大于
-ge大于等于
-eq等于
-ne不等与
-lt小于
-le小于等于
字符串测试
是否
==
>
<
!=不等于
~= 左侧字符串是否可以被右侧的模式(PATTERN)所匹配(全部匹配);
-z "STRING" 测试字串是否为空 空则为真1
-n "STRING" 测试字符串是否不空 不空为真1
用于字符串比较式用到的操作数都要使用引号
name=Obama
[ -z "$name"]
$? 显示0表示运行成功]]
bash测试类型
数值测试
是否
-gt大于
-ge大于等于
-eq等于
-ne不等与
-lt小于
-le小于等于
字符串测试
是否
==
>
<
!=不等于
=~ 左侧字符串是否可以被右侧的模式(PATTERN)所匹配(全部匹配);
此处一般用于[[ ]]测试符号中
-z "STRING" 测试字串是否为空 空则为真1
-n "STRING" 测试字符串是否不空 不空为真1
用于字符串比较式用到的操作数都要使用引号
name=Obama
[ -z "$name"]
$? 显示0表示运行成功
文件测试