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不会对单引号内的变量求值,原样输出。
  • 在双引号时,需要对特殊字符转义,比如叹号等,用 \ 转义
3、printf也是终端打印命令,和C中的用法类似,默认需要手动添加换行符

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的输入。
  • 重定向脚本内部的文本块。
  • 自定义文件描述符。
6、数组与关联数组

  • 定义:   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)
15、以不按回车的方式读取字符"n"

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 重命名


0 0
原创粉丝点击