shell基础知识
变量定义的基本规则
- 区分大小写,同名称但大小写不同的变量名是不同的变量
- 定义时的格式要注意,等号两边不能有空格,对于有空格的字符串做为赋值时,要用引号引起来
- 单引号与双引号的区别: 单引号内的变量或者特殊字符仅为一般字符,但双引号内的变量或者特殊字符可以保持它的变量特性
变量定义的基本方式
- 直接把值赋值给变量
a=1
- 命令的执行结果可以做为变量的值赋值给变量
| 符号 | 说明 |
|---|---|
| ` ` 反撇号 (在键盘ESC键下面,TAB键上面的那个按键) | 执行符号,用于执行符号内的命令 |
| $( ) | 执行符号,用于执行符号内的命令(建议) |
- 通过read交互式定义变量
| read命令常用参数 | 说明 |
|---|---|
| -p | 交互对话提示信息 |
| -s | 隐藏输入 |
| -n接数字 | 指定交互最多只能输入几位字符 |
| -t接数字 | 批定交互的时间最多只能几秒 |
4.替换符
file=/dir1/dir2/dir3/my.file.txt
我们可以用 ${ } 分别替换获得不同的值:
${file#*/}:拿掉第一条 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file#*1/}:拿掉第二条 / 及其左边的字符串:dir2/dir3/my.file.txt
${file##*/}:拿掉最后一条 / 及其左边的字符串:my.file.txt
${file#*.}:拿掉第一个 . 及其左边的字符串:file.txt
${file##*.}:拿掉最后一个 . 及其左边的字符串:txt
${file%/*}:拿掉最后条 / 及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:拿掉第一条 / 及其右边的字符串:(空值)
${file%.*}:拿掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}:拿掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my
我们也可以对变量值里的字符串作替换:
${file/dir/path}:将第一个dir替换为 path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部dir替换为 path:/path1/path2/path3/my.file.txt
- 系统变量(内置bash中变量): shell本身已经固定好了它的名字和作用,可以直接在shell脚本中调用。
| 内置变量 | 说明 |
|---|---|
| $? (==重点==) | 上一条命令执行后返回的状态,当返回0时表示执行正常,非0表示执行异常或出错 |
| $$ | 当前所在进程的进程号(pid) 如: # kill -9 $$会退出当前会话 |
| $0 | 当前执行的程序名称 如: 在脚本里sh $0代表重新执行此脚本(会产生子进程) |
$1 -$9 (==重点==) |
位置参数变量。如: /etc/init.d/sshd restart 这个restart就是对应$1 |
${10}-${n} |
扩展位置参数变量, 第10个位置变量必须用{}大括号括起来(了解即可,几乎用不到) |
| $# | 脚本后面接的参数的个数 |
$*或$@ |
脚本后面所有参数 |
Bash shell 算术运算的方式:
- 使用$[ ] (==建议主用这种就可以了,其它可以看懂即可==)
- 使用 $(( ))
- 使用expr外部程式
- 使用let命令
- 借助bc命令
命令:wc
统计命令
| 参数 | 说明 |
|---|---|
| -l | 统计行数 |
| -c | 查文件所有行有多少字符(换行符也算一个字符) |
| -m | 查文件所有行有多少字符(换行符也算一个字符) |
| -L | 查文件最长的行有多少字符(换行符不算字符) ==可用于计算单行长度== |
命令:cut
截取命令,特点:只能以单个字符为分隔符。后面讲awk和sed在截取的很多方面比cut更有优势.
| 参数 | 说明 |
|---|---|
| -d | 指定分隔符 |
| -f | 指定第几列 |
| -c | 截取第几个字符 |
命令:sort
排序命令
| 参数 | 说明 |
|---|---|
| -r | 反向排序 |
| -n | 以数字来排 |
| -f | 大小写不敏感 |
| -t | 分隔符 |
| -k | 接数字代表第几列 |
命令:uniq
去重命令
| 参数 | 说明 |
|---|---|
| -c | 去重后统计 |
命令:grep
行查找命令(后面讲正则表达式会重点使用)
| 参数 | 说明 |
|---|---|
| -n | 显示行号 |
| -v | 反向查找 |
| -i | 大小写不敏感 |
| -E或egrep | 扩展模式 |
| -o | 把查出的关键字全显示出来,方便统计次数 |
| -f | 适合查找两个文件重复的行 |
| -A | 后接数字n,表示可以查找的那行还会显示下面的n行 |
练习:
对有下面内容的文件进行操作
# cat 1.txt
http://a.domain.com/1.html
http://b.domain.com/1.html
http://c.domain.com/1.html
http://a.domain.com/2.html
http://a.domain.com/3.html
http://b.domain.com/3.html
http://c.domain.com/2.html
http://c.domain.com/3.html
http://a.domain.com/1.html
得到下面的结果
4 a.domain.com
3 c.domain.com
2 b.domain.com
比较死板的命令可以得到上面的结果:
cat 1.txt | cut -c8-19 | sort -f | uniq -c | sort -k1 -r
与文件有关的判断
语法格式
- 格式1: ==test== 条件表达式
- 格式2: [ 条件表达式 ]
- 格式3: [[ 条件表达式 ]] 支持正则 =~
| 判断参数 | 说明 |
|---|---|
| -e (常用) exist | 判断文件(任何类型文件)是否存在 |
| -f (常用) file | 判断是否为普通文件 |
| -d (常用) directory | 判断是否为目录 |
| -S | 判断是否为socket文件 |
| -p | 判断是否为pipe管道文件 |
| -c | 判断是否为character字符设备文件 |
| -b | 判断是否为block块设备 |
| -L link | 判断是否为软链接 |
| -s | 判断文件是否存在并且为非空文件 |
示例:
[ ! -d /etc ] 判断目录是否存在,不存在条件为真 (中括号里面左边两边有空格)
[[ -f /etc/fstab ]] 判断文件是否存在,并且是普通文件 (中括号里面左边两边有空格)
文件权限相关的判断
| 判断参数 | 说明 |
|---|---|
| -r | 当前用户对其是否可读 |
| -w | 当前用户对其是否可写 |
| -x | 当前用户对其是否可执行 |
| -u | 是否有suid(权限9位的前3位里是否有s位) |
| -g | 是否sgid(权限9位的中间3位里是否有s位) |
| -k | 是否有t位(权限9位的后3位里是否有t位) |
两个文件的比较判断
| 判断表达式 | 说明 |
|---|---|
| file1 -nt file2 | 比较file1是否比file2新 |
| file1 -ot file2 | 比较file1是否比file2旧 |
| file1 -ef file2 | 比较是否为同一个文件,或者用于判断硬连接,是否指向同一个inode |
整数之间的判断
| 判断参数 | 说明 |
|---|---|
| -eq | 相等 |
| -ne | 不等 |
| -gt | 大于 |
| -lt | 小于 |
| -ge | 大于等于 |
| -le | 小于等于 |
字符串之间的判断
| 判断参数或表达式 | 说明 |
|---|---|
| -z | 是否为空字符串,字符串长度为0则为真 |
| -n | 是否为非空字符串,只要字符串非空则为真 |
| string1 = string2 | 两个字符串是否相等 |
| string1 != string2 | 两个字符串是否不等 |
多重条件判断
| 判断参数 | |
|---|---|
| 条件1 -a 条件2 (and) 条件1 && 条件2 | 两个条件同时满足,整个大条件为真 |
| 条件1 -o 条件2 (or) 条件1 || 条件2 | 两个条件满足任意一个,整个大条件为真 |
示例:
[ 1 -eq 1 -a 1 -ne 0 ] 整个表达式为真
[ 1 -eq 1 ] && [ 1 -ne 0 ]
[ 1 -eq 1 -o 1 -ne 1 ] 整个表达式为真
[ 1 -eq 1 ] || [ 1 -ne 1 ]
使用&&与||符号实现判断语句
| 符号 | 说明 |
|---|---|
| ; | 不管前面执行是否正确,都会执行后面 |
| && | 前面执行正确,才会执行后面 |
| || | 前面执行失败,才会执行后面 |
条件 && 动作 # 前面条件满足则执行动作
条件 || 动作 # 前面条件失败则执行动作
条件 && 动作1 || 动作2 # 如果条件满足,则执行动作1,否则则执行动作2
浙公网安备 33010602011771号