shell学习笔记
来源:互联网 发布:bbc动物纪录片知乎 编辑:程序博客网 时间:2024/06/05 13:23
1、运行方式
a sh test.sh
b 将脚本作为具有执行权限的可执行文件:首先授权chmod a+x test.sh 然后用 ./test.sh #./ (当前目录) 或者/home/path/test.sh # 表示完整路径
2、echo 终端打印(每次调用后会添加一个换行符)
a 文本可用双引号、单引号、和不加引号
b 副作用:
- 使用不带引号的的echo时,无法显示分号,因为分号是shell的命令鉴定符
- 使用单引号时,bash不会对单引号内的变量求值,原样输出。
- 在双引号时,需要对特殊字符转义,比如叹号等,用 \ 转义
4、echo -n 可以忽略结尾的换行符,-e接收双引号字符串内的转义序列,-e打印彩色输出
6、env查看所有与终端进程相关的环境变量。
5、在bash中,每一个变量的值都是字符串,无论你给变量赋值时有没有引号。
- pgrep 进程 :查看进程号。
- tr 替换字符
- 对于每个进程,可通过cat /pro/$PID/environ 查看其运行时环境变量。返回变量及其变量值的列表,每个变量之间有null字符(\0)分割,如果换成\n,则可换行输出。
- 如果变量值value中不包含任何空白字符,那么不需要单双引号,反之,则必须使用。
- var=value是赋值操作,var = value 是相等操作。
- 在变量前加$就可以打印出变量, $var 或者 ¥{var}
- printf或者echo命令的双引号中引用变量值。
- 环境变量时未在当前进程中定义,而从父进程中继承而来的变量,export命令用来设置环境变量,从当前shell脚本执行的任何程序都会继承这个变量,
- 标准环境变量:PATH HOME PWD USER UID SHELL 等
- 获取字符串长度: ${#var}
- 查看当前shell版本等: echo $SHELL 或者echo $0
- root的uid是0 ,所以可以用$UID -ne 0 来判断是否是超级用户
- let命令可以直接执行基本的算术操作,变量名不需要加$
- 如果想进行浮点数运算,那就得用bc result=‘echo “$no * 1.9 "| bc'
- >是先清空文件,然后写入,>> 是追加写入
- 文件描述符:与文件输入、输出相关的整数,用来跟踪已打开的文件。 0 --- stdin 1 --- srdout 2 --- stderr
- 2> 或者 2>>把stderr输出到文件
- 将stderr转换成stdout,是的都重定向到同一文件, cmd 2>&1 output.txt 或者 cmd &> output.txt
- 可以重定向到/dev/null,起到清除的作用。
- 通过重定向,当重定向到文件中时,也就没有什么东西可以通过管道传给接下来的命令,而这些命令是通过stdin来接收文本的。
- tee命令可以一方面把数据重定向到文件,另一方面还可以提供一份重定向数据的副本作为后续命令的stdin。默认是覆盖文件内容,通过添加-a,可以追加内容。
- cdm < file 将文件重定向到命令。作为stdin的输入。
- 重定向脚本内部的文本块。
- 自定义文件描述符。
- 定义: arr=(1 2 3) 或者 arr[0]=1 arr[1]=2
- 读取: ${arr【0】 } 全部读取${arr[*]}或者${arr[@]} 数组长度 ${#arr[*]}
- 关联数组:从bash4.0版本开始被引入,可以使用字符串最为数组索引,借助的是散列技术。
7、使用别名,有多种方式实现,比如alias,比如用函数等
- alias命令的作用只是暂时的,一旦关闭当前终端,所有设置过的别名就失效了,为了是别名一直保持作用,可放入 ~/.bashrc文件中,因为每一个新的shell进程生成时都会执行他中的命令。删除时用unalias或者直接从~/.bashrc中删除。
- 使用函数创建别名:定义一个具有新名称的函数,并把它写入~/.bashrc
- 对别名进行转义:字符\对命令实施转义,使我们可以执行原本的命令,而不是这些命令的别名替身,在不信任的环境下执行特权命令,在前面加/,忽略可能存在的别名设置。
8、获取终端信息:
- tput和stty是两款终端处理工具, -echo 禁止将输出发送到终端,而echo泽允许发送输出。
- tput常用于设置光标位置和终端颜色。
9、在脚本中使用延时:sleep num
10、调试脚本
使用-x,启动跟踪调试shell脚本。允许带有-x的脚本能打印出所执行的每一行命令以及当前状态,不过可以通过使用set 命令,只关注脚本某些部分的命令及函数的打印输出,set是加在脚本中来启用或者禁止调试打印。
- set -x 在执行时显示参数和命令;
- set +x 禁止调试
- set -v 当命令进行读取时显示输入
- set +v 禁止打印输入
使用shebang进行调试。
11、函数与参数
- 定义:function name(){} 或者name(){}
- 调用:只需要函数名就可以调用 name
- 参数传递:name param1 param2 在函数定义时,不需要在括号里写参数
- $1是第一个参数,$n是第n个参数,$@扩展成"$1" "$2" "$3"等 $* 扩展成“$1c$2c$3" c是IFS的第一个字符。相当于把所有参数看出一个处理。
- 递归函数
- 导出函数:使用export -f name ,可以吧函数的作用域扩展到子进程中。
- 向命令传递参数
12、读取命令返回值:$? 会给出前一个命令的返回值,即退出状态,这样可以分析命令执行成功与否,成功为0,否则不为0
13、 读取命令的输出
用var=$(commands) 如 var=$(ls|cat -n) PS:cat -n 连同行号一起读取
用反引号:var=·commands·
14、利用子shell生成一个独立的进程。
- 子shell本身就是一个独立的进程,可以用()来定义个一个子shell:pwd;(cd /bin;);pwd; 命令在子shell中执行时不会对当前shell有任何影响,所有改变仅限于子shell
- 可以使用子shell或者反引号把命令的输出读入一个变量中,可以将它放入双引号中,以保留空格和换行符(\n).out=$(cat tex.txt)
read是一个重要的bash命令,用于从键盘或者标准输入中读取文本。我们可以使用read以交互的形式读取用书的输入。
读取n个字符到var变量 read -n num-of-char var-name
用不回显方式读取密码:read -s var
显示提示信息: read -p ”enter input:” var
在特定时间限制内输入: read -t 2 var
用定界符结束输入: read -d “:” var 以冒号为结束符(不包含冒号)
16、内部字段分隔符(internal field sepator)IFS。 它是一个环境变量,默认是空白字符(换行符、制表符、空格),当迭代一个字符串或者CSV(comma separated value逗号分隔型数值)中的单词是,就可以使用。
17、循环
for循环:
方法一:
for var in list;
do
commands;
done
方法二:
for((i=0;i<10;i++)){
commands;
}
while循环:
while condition
do
commands;
done
until循环:
18、比较与测试
if condition;
then
commands;
elif condtions;
then
commands
else
commands
fi
【condation】&&action 如果condition为真,泽执行action
【condation】|| action 如果condition为假,则执行action
19、算术比较
条件通常被放在中括号内,一定要注意,在中括号和操作数之间有一个空格,否则出错。
【 $var -eq 0 】 -eq 等于 -ne 不等于 -gt 大于 -lt 小于 -ge 大于等于 -le 小于或者等于 逻辑yu -a 逻辑或 -o
20、文件系统相关测试
【 -f $file_var 】;如果给定的变量包含正常的文件路径或者文件名,则返回真
【 -x $var 】:如果给的变量包含的文件可执行,返回真
【 -d $var 】 如果是目录,为真
【 -e $var 】 :变量包含的文件存在,为真
【 -c $var 】给定的变量包含的是一个字符设备文件的路径,则真
【 -b $var 】 给定的变量包含的是一个块设备文件的路径,则真
【 -w ¥var】 变量包含的文件可写,则zhen
【-r $var] 可读,真
【-L $var】 变量包含的是一个符号链接,则zhen
21.变量赋值时等号前后不能有空格,而比较时必须有空格
22、字符串比较
使用字符串比较时,最好用双中括号,因为有时候采用单个中括号会产生错误。比较时在等号前后各有空格。
用的是 = != > <
【【 -z $var 】】如果包含的是空字符串,则真
【【 -n $var 】】如果包含的是非空字符串,则真
可以用&& || 组合使用
23、test命令可以用来执行条件检测,用test有助于避免使用过多的括号
【 ¥var-eq 0】相当于 test $var -eq 0
24、cat(concatenate):
读取多个文件内容:cat file1 file2 file3
cat不仅可以读取文件并拼接数据,还可以从表中输入中进行读取。但需要借助管道。而且可以讲文件的内容和标准输入拼接在一起。 echo 'test throgh sedin' | cat - file.txt其中横杠是代表标准输出文本的文件名
压缩空白行: cat -s
也可以移除空白行 用tr cat txt | tr -s ‘\n'
在tr的这种用法中,他可将连续多个’\n'压缩成一个
cat -n 每行前面加行号
25、录制和回放终端会话(录制和回放一段时间的命令执行)
开始录制:script -t 2> timing.log -a output.session timing.log存储时序信息,描述每一个命令在合适运行。另一个文件存储命令行输出。
scriptreplay timing.log output.sesion //按播放命令序列输出
26、find
find 目录 -print 列出该目录下的所有文件和文件夹,-print 用'\n'分割 -print0 用'\0'定界
find 目录 -name ’正则表达式“ -print 查找 -iname 是忽略大小写
find . \( -name "*.txt -o "*.pdf"\) -print 列出txt和pdf的文件
否定参数: ! find . ! -name "*.txt" -print 找不以txt结尾的文件
限制遍历深度: -maxdepth -mindepth
27、xargs 有些命令只能以命令行参数的形式接收数据,而无法通过stdin接收数据流,所以就不可以使用管道。xargs可以讲标准输入转换成命令行参数,也可以讲单行或者多行转化成其他格式。
换单行: cat wx.txt | sargs
单行换其他格式: cat txt | xargs -n 5 每行5个字符
-d ‘fdasf’ 可作为定界符 默认是IFS
28、tr 可以对来自标准输入的字符进行替换、删除以及压缩。
tr 只能通过stdin 而无法通过命令行参数来接收输入。tr set1 set2 如果两个字符集长度不等,则set2会不断重复最后一个字符,知道相等,如果set2长,泽长出的部分直接忽略。
29、校验和雨核实
md5sum sha1sum dm5deep sha1deep
30、排序、单一和重复
sort
uniq 通过消重复内容,从给定输入中找出单一的行,也可以用来找出输入中出现的重复行。uniq只能用于拍过需的数据输入,因此,uniq要么使用管道,要么将拍过序的文件作为输入,并总会和sort结合起来使用。
31、分割文件盒数据:
dd split csplit
借助%可以轻松将名称部分从“名称.扩展名”从去除文件名。 file=“a.jpg' name=${file%.*} name的值就是a 前面的含义是从$file 中删除位于%右边的通配符所匹配的字符串,通配符从右向左进行匹配。
%是非贪婪型的,从右向左匹配通配符的最短结果。 %%是贪婪的,匹配最长的。
${var#*.} 从左向右匹配。a。jsp 输出 jsp ##是贪婪型的
32 rename 重命名
- [Bash Shell] Shell学习笔记
- [Bash Shell] Shell学习笔记
- shell shell学习笔记001--什么是shell?
- shell学习笔记【原创】
- shell学习笔记2
- shell(bash)学习笔记
- Shell学习笔记
- shell学习笔记《一》
- Unix shell学习笔记
- shell编程学习笔记
- shell学习笔记
- Linux Shell学习笔记
- Shell学习笔记
- Power Shell 学习笔记
- Shell 编程-学习笔记
- shell编程学习笔记
- Shell学习笔记
- shell 学习笔记
- RAMDISK: incomplete write-解决办法
- Ajax
- shell split字符串的几种方法
- 标准c++中string类
- CI框架去掉URl中的index.php部分
- shell学习笔记
- 解决ie的window.open的referer丢失问题。
- 为什么梯度方向是函数值增长最快而不是下降最快的方向?
- launcher3去掉ALLAPP按键
- 换一个角度去感悟人生
- spring session入门
- UML的开始
- 最长平台问题 C实现
- 按字母顺序以及区间排序汉字