一、变量的定义
1、等号两边不能接空格
2、变量名称只能是英文开头,后面可以接数字和英文
3、变量内容使用""括起来时,其内的特殊字符如$保持原有特性
4、变量内容使用''括起时,期内的内容均为一般字符
5、可用转义字符\将特殊字符转义一般符号
6、命令中需要其他命令提供的信息,$(命令)。如定义version=$(uname -r)
7、为某个变量增加内容时,使用$变量名称累加。如设置PATH=$PATH:/home/admin/gradle-3.3/bin
8、export使变量变为环境变量
9、通常大写为系统默认变量,小写为自定义变量
10、取消变量设置:unset 变量名
符合规则的:
param=test
param="test t1"
param='t'
错误方式
param = test
param=test test
1param=test
二、环境变量
$ : 除了可以获取定义的变量外,其本身也是一个环境变量,代表的是目前这个shell的线程PID
? : 上个执行命令的回传码,执行某些命令时,都会回传一个执行后的代码。一般成功执行回传0,非0就是执行过程发生错误
三、数据流重定向
标准输入 stdin:代码0,使用< 或 <<
标准输出 stdout:代码1 使用> 或 >>
错误输出stderr: 代码2 使用 2> 或 2>>
/dev/null : 垃圾桶黑洞设备,可以吃掉任何导向这个设备的信息。如想将错误信息忽略 find /rot -name s 2> /dev/null,此时错误信息不会在屏幕显示
正确与错误信息输入到同一个文件:
操作命令 > 文件 2>&1 或者 操作命令 &> 文件
例:
rock:test cc$ ll > rootfile
rock:test cc$ cat rootfile
total 32
drwxr-xr-x 7 cc staff 224 7 17 23:00 ./
drwxr-xr-x 12 cc staff 384 6 20 07:40 ../
使用ll并未在屏幕上显示信息,因为使用> 此时ll的结果被输入到rootfile中,若rootfile不存在,则创建,若存在则清空。如果不想清空而是继续追加 则使用 >>
四、特殊字符
cmd;cmd : 无相关性的连续命令执行。在命令间使用;分割,分号前的命令执行完会接着执行后面的命令
$? : 获取命令回传码
五、管道命令pipe (|)
管道命令仅会处理stdout
管道命令必须能够接收来自前一个命令的数据成为stdin继续处理
1、选取命令 cut,grep
作用:分析一行数据,取出需要的数据
cut
命令:cut -d'分隔字符' -f index[,index]
例:以:作为分割符,取指定index的
rock:test cc$ echo $PATH
/Library/Frameworks/Python.framework/Versions/3.6/bin:/Users/cc/maven/apache-maven-3.3.9/bin:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/bin:/Users/cc/app/phantomjs/bin
rock:test cc$ echo $PATH | cut -d':' -f 1
/Library/Frameworks/Python.framework/Versions/3.6/bin
rock:test cc$ echo $PATH | cut -d':' -f 1,3
/Library/Frameworks/Python.framework/Versions/3.6/bin:/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/bin
命令:cut -c 截取范围
例:
rock:test cc$ echo $PATH | cut -c 1-
/Library/Frameworks/Python.framework/Versions/3.6/bin
rock:test cc$ echo $PATH | cut -c 1-5
/Libr
rock:test cc$ echo $PATH | cut -c -5
/Libr
grep [-acinv] [--color=auto] '查找字符串' filename
-a 将binary文件以text文件的方式查找数据
-c 计算找到'查找字符串'的此时
-i 忽略大小写
-n 输出行号
-v 反向选择,即显示出不符合条件的
--color=auto 加颜色
例
2、排序命令sort、wc、uniq
sort 根据不同的数据类型排序
命令:sort [-fbMnrtuk] [file or stdin]
-f 忽略大小写
-b 忽略最前面的空格符
-M 以月份的名字排序
-n 使用纯数字排序
-r 反向排序
-u uniqe相同的数据只出现一行
-t 分隔符,默认 [tab]
-k 以哪个index排序
例子:
rock:test cc$ cat rootfile | sort
-rw-r--r-- 1 cc staff 0 7 17 08:08 bashtest.sh
-rw-r--r-- 1 cc staff 0 7 18 22:06 rootfile
-rw-r--r-- 1 cc staff 8 7 17 22:59 test
-rw-r--r-- 1 cc staff 262 7 17 23:00 test1
-----------------------------------
rock:test cc$ cat rootfile | sort -t ':' -k 1
-rw-r--r-- 1 cc staff 0 7 17 08:08 bashtest.sh
-rw-r--r-- 1 cc staff 0 7 18 22:06 rootfile
-rw-r--r-- 1 cc staff 8 7 17 22:59 test
-rw-r--r-- 1 cc staff 262 7 17 23:00 test1
-rw-r--r--@ 1 cc staff 6148 7 17 08:08 .DS_Store
drwxr-xr-x 7 cc staff 224 7 17 23:00 ./
drwxr-xr-x 12 cc staff 384 6 20 07:40 ../
total 32
-----------------------------------
rock:test cc$ cat rootfile | sort -t ':' -k 2
total 32
drwxr-xr-x 7 cc staff 224 7 17 23:00 ./
-rw-r--r-- 1 cc staff 262 7 17 23:00 test1
-rw-r--r-- 1 cc staff 0 7 18 22:06 rootfile
-rw-r--r--@ 1 cc staff 6148 7 17 08:08 .DS_Store
-rw-r--r-- 1 cc staff 0 7 17 08:08 bashtest.sh
drwxr-xr-x 12 cc staff 384 6 20 07:40 ../
-rw-r--r-- 1 cc staff 8 7 17 22:59 test
uniq unqie重复数据筛选
命令:uniq [-ic]
-i 忽略大小写
-c 计数
wc 计算输出的信息的整体数据
命令:wc [-lwm]
-l 仅列出行
-w 仅列出都是字
-m 多少字符
例子:
rock:test cc$ cat rootfile | wc
8(行数) 65(字数) 359(字符数)
rock:test cc$ cat rootfile | wc -l
8
rock:test cc$ cat rootfile | wc -w
65
rock:test cc$ cat rootfile | wc -m
359
3、双向重定向 tee
tee [-a] file
-a 累加方式写入数据到file
例子:last | tee -a test.txt | more
4、字符转换tr 、col、join、paste、expand
tr 替换/删除文字
命令:tr [-ds] str [str1]
-d 删除信息中的str
-s 替换重复字符
例子:
rock:test cc$ cat rootfile | tr -d ':'
total 32
drwxr-xr-x 7 cc staff 224 7 17 2300 ./
drwxr-xr-x 12 cc staff 384 6 20 0740 ../
-rw-r--r--@ 1 cc staff 6148 7 17 0808 .DS_Store
-rw-r--r-- 1 cc staff 0 7 17 0808 bashtest.sh
-rw-r--r-- 1 cc staff 0 7 18 2206 rootfile
-rw-r--r-- 1 cc staff 8 7 17 2259 test
-rw-r--r-- 1 cc staff 262 7 17 2300 test1
------------------
rock:test cc$ cat rootfile | tr 't' '0'
0o0al 32
drwxr-xr-x 7 cc s0aff 224 7 17 23:00 ./
drwxr-xr-x 12 cc s0aff 384 6 20 07:40 ../
-rw-r--r--@ 1 cc s0aff 6148 7 17 08:08 .DS_S0ore
-rw-r--r-- 1 cc s0aff 0 7 17 08:08 bash0es0.sh
-rw-r--r-- 1 cc s0aff 0 7 18 22:06 roo0file
-rw-r--r-- 1 cc s0aff 8 7 17 22:59 0es0
-rw-r--r-- 1 cc s0aff 262 7 17 23:00 0es01
col [-xb]
-x 将tab键转换为对等的空格键
-b 文字内有反斜杠/ 时,仅保留反斜杠后的两个字符
join 将两个文件中有相同数据的一行加在一起
命令:join [-ti12] file1 file2
-t join默认以空格符分隔数据
-i 忽略大小写
-1 index : 数字1,代表第一个文件用第几个字符分析
-2 index : 数字2,代表第二个文件用第几个字符分析
paste 将两行数据黏贴在一起,且中间以[tab]隔开
命令:paste [-d] file1 file2
- file部分写-表示使用stdin的数据
-d 后接分隔字符,默认tab键
expand 将tab键转为空格键
expand [-t] file
-t 后接数字,表示用几个数字替换tab ,默认tab用8个空格替换,
split 切割
命令:split [-bl] file PREFIX
-b 后接欲切割成的文件大小
-l 以行数切割
PREFIX 前导符,可作为切割文件的前导文件
xargs 参数代换
产生某个命令的参数,可以读入stdin的数据以空格或断行进行分辨,将stdin的数据分隔为arguments
命令:xargs [-0epn] command
-0 输入的stdin含特殊字符时,还原为一般字符
-e 后面接字符串,碰到字符串即停止
-p 执行每个命令的参数时,询问用户
-n 后接次数,每次command执行时,使用几个参数
减号(-)的特殊意义
如:ls -al / | split -l 10 - lsroot
此时-用作stdin,读取管道符|前的stdout作为stdin,然后切割了放入lsroot开头的文件
六、read
read [-pt] var
-p 后接提示符
-t 等待的秒数
示例: 显示提示符并等待20秒,name用于获取用户键盘输入
read -p "Please input your name: " -t 20 name
$name:使用上述用户输入值
七、变量内容的删除、替代与替换
1、删除
# 表示从变量内容的最前面开始向右删除,且删除最短的那个
## 删除最长的
% 从后向前,最短
%% 从后向前,最长
${var#要被删除的部分}
例:
2、替换
替换首个 ${path/旧字符/新字符}
替换所有 ${path//旧/新}
3、内容判断与替换
当old未定义(不包含空字符串),此时new取值content
new_var=${old_var-content}
例:
rock:~ cc$ echo $test
rock:~ cc$ test=${test-default}
rock:~ cc$ echo $test
default