Linux Shell脚本攻略


Linux Shell简介


  1. Shell脚本通常是一个以shebang(#!/bin/bash)起始的文本文件,其中/bin/bash是Bash的解释器命令路径。
  2. Shell脚本有两种运行方式:
  • 一种是将脚本作为bash的命令行参数,如:
    • $ bash script.sh #假设脚本位于当前目录下
    • $ bash /home/path/script.sh #使用脚本的完整路径
  • 另一种则是授予脚本执行权限,将其变为可执行文件。
    • $ chmod a+x script.sh #赋予脚本执行权限
    • $ ./script.sh; #使用相对路径
    • $ /home/path/script.sh #使用完整路径
  1. 在Bash中,每个命令或是命令序列是通过分号或换行符来分隔的,如$ cmd1;cmd2
  2. 注释部分以#开始,一直延续到行尾。

终端打印


  1. echo是用于终端打印的基本命令,在默认情况下,echo在每次调用后会在末尾添加一个换行符。
  2. echo打印文本有三种形式
    • 使用双引号:$ echo "Welcome to Bash"
    • 使用单引号:$ echo 'Welcome to Bash'
    • 不使用引号:$ echo Welcome to Bash
  3. 三种方法各有些限制
    1. 使用不带引号的echo时,没法在所要显示的文本中使用分号(?,因为分号在Bash中会被识别为命令定界符。
    2. 使用单引号时,变量替换在单引号中无效。如下所示:
      • $ echo '$var' 会打印出 $var
      • $ echo "$var" 会打印出var的值
    3. 使用双引号时,在不使用转义字符()的情况下无法打印!符号。
  4. 另一个可用于终端打印的命令是printf,printf使用的参数和C语言中的printf函数一样,例如$ printf "Hello world"。printf使用引用文本或由空格分隔的参数。
  5. 我们可以在printf中使用格式化字符串,还可以指定字符串的宽度、左右对齐方式等。在默认情况下,printf并不会像echo一样自动添加换行符,我们必须在需要的时候手动添加,如:
	#!/bin/bash
	#文件名:printf.sh
	printf "%-5s %-10s %-4s\n" No Name Mark
	printf "%-5s %-10s %-4.2f\n" 1 Sarath 80.3456
	printf "%-5s %-10s %-4.2f\n" 2 James 90.9989
	printf "%-5s %-10s %-4.2f\n" 3 Jeff 77.564

  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

运行上述脚本,我们会得到如下输出:
输出

  1. %s、%c、%d和%f都是格式替换符(format substitution character),其所对应的参数可以置于带引号的格式字符串之后。
  2. 在使用echo和printf的命令选项时,要确保选项应该出现在命令行内所有的字符串之前,否则Bash会将其视作另外一个字符串。
  3. 在默认情况下,echo会将一个换行符追加到输出文本的尾部,可以使用选项-n来忽略结尾的换行符,如$ echo -n "Hello bash"
  4. echo同样接受双引号字符串内的转义序列作为参数,如果需要使用转义参数,需要使用-e选项。如$ echo -e "1\t2\t3"

变量和环境变量


  1. 脚本语言通常不需要在使用变量之前声明其类型,只需要直接赋值就可以。
  2. 在Bash中,每一个变量的值都是字符串,无论给变量赋值时有没有使用引号,值都会以字符串的形式存储。
  3. 有一些特殊的变量会被shell环境和操作系统环境用来存储一些特别的值,这类变量称为环境变量。
  4. env命令可以查看所有全局环境变量。
  5. set命令可以查看所有环境变量。
  6. unset命令可以针对当前会话删除一个变量。
  7. 环境变量的配置文件
    • 全局:/etc/prifile
    • 局部:~/.bash_profile
  8. 对于进程来说,其运行时的环境变量可以使用下面的命令来查看:
    • $ cat /proc/$PID/environ #$PID用进程ID替代
    • 可以使用pgrep命令来获取进程ID,如$ pgrep gedit
    • 上述命令返回一个包含环境变量以及对应变量值的列表,每个列表以name=value的形式来描述,彼此之间由null字符(\0)分隔,如果将\0替换成\n,那么就可以将输出重新格式化,使得每一行显示一组“变量=值”,替换可以使用tr命令。
    • $ cat /proc/$PID/environ | tr '\0' '\n'
  9. 变量赋值
    • var=value;
    • 如果value不包含任何空白字符(例如空格),那么它就不需要使用引号进行引用,否则必须使用单引号或双引号。
    • var = value不同于var=value,后者是赋值,前者是相等操作。
  10. 在变量名之前加上$前缀就可以打印出变量的内容。
    • $ echo $var
    • $ echo ${var}
  11. 我们可以在printf或echo命令的双引号中引用变量值
    • $ echo "We have $count ${fruit}(s)"
  12. 环境变量是未在当前进程中定义,而从父进程中继承而来的变量。例如环境变量HTTP_PROXY,定义了互联网连接应该使用哪个代理服务器。
    • HTTP_PROXY=192.168.1.23:3128
    • $ export HTTP_PROXY
  13. export命令用来设置环境变量,至此之后,从当前shell脚本执行的任何应用程序都会继承这个变量。
  14. 我们可以根据自己的需要,在执行的应用程序或者shell脚本中导出特定的变量,在默认情况下,有很多标准环境变量可供shell使用,PATH就是其中之一。
    • $ echo $PATH
  15. 在给出所要执行的命令后,shell会自动在PATH环境变量所包含的目录列表中(各目录路径之间以冒号间隔)查找对应的可执行文件。
    • $ export PATH="$PATH:/home/user/bin" #在PATH中添加新路径
  16. 还有一些众所周知的环境变量,如
    • HOME:用户主目录
    • PWD:当前路径
    • USER:当前用户
    • UID:用户的ID号
    • SHELL:当前默认shell程序
  17. 使用单引号时,变量不会被扩展,将依照原样显示,这意味着:
    • $ echo '$var' 会打印出 $var
    • $ echo "$var" 会打印出var的值
  18. 获得字符串长度
    • $ echo ${#var}
  19. 识别shell
    • 默认shell:$ echo $SHELL
    • 当前使用shell:$ echo $0
  20. 超级用户(root)的UID是0。
  21. 当我们打开终端或是运行shell时,会看到类似于user@hostname:/home/$的提示字符串。不同GNU/Linux发布版中的提示及颜色略有不同。我们可以利用PS1环境变量来定制提示文本。 默认的shell提示文本是在文件~/.bashrc中的某一行设置的。
    • $ cat ~/.bashrc | grep PS1
    • $ PS1="PROMPT>"
  22. 有一些特殊的字符可以扩展成系统参数
    • \u可以扩展为用户名
    • \w可以扩展为当前工作目录
    • \h可以扩展为主机名

使用Shell进行数学运算


  1. 在Bash Shell中,可以利用let、(())和[]执行基本的算术操作,而在进行高级操作时,expr和bc这两个工具也会非常有用。
  2. 可以用普通的变量赋值方法定义数值,这时,它会被存储为字符串,然而我们可以用一些方法使它能像数字一样进行运算。
    • $ no1=4; no2=5
  3. let命令可以直接执行基本的算术操作,当使用let时,变量名之前不需要加$,如:
    • $ let result=no1+no2; echo $result
    • 自加操作:$ let no1++
    • 自减操作:$ let no1--
    • 简写形式:$ let no+=6; let no-=6
  4. 操作符[]的使用方法和let命令类似:
    • $ result=$[ no1 + no2]
    • []中可以使用$前缀,如:$ result=$[$no1 + 5]
  5. 使用(())[]类似:
    • $ result=$(( no1 + 50 ))
    • (())中也可以使用$前缀,如:$ result=$(( $no1 + 50 ))
  6. expr同样可以用于基本算术操作:
    • $ result=`expr 3 + 4`
    • $ result=$(expr $no1 + 5)
  7. let、(())和[]只能用于整数运算,不支持浮点数。
  8. bc是一个用于数学运算的高级工具,这个精密计算器包含了大量的选项,我们可以借助它执行浮点数运算并应用一些高级函数。
    • $ echo "4 * 0.56" | bc
    • $ no=54; result=`echo "$no * 1.5" | bc`; echo $result
  9. 其他参数可以置于要执行的具体操作之前,同时以分号作为定界符,通过stdin传递给bc。
    • 设定小数精度:echo "scale=2;3/8" | bc;
    • 进制转换:
      • $ no=100; echo "obase=2;$no" | bc;
      • $ no=1100100; echo "obase=10;ibase=2;$no" | bc
    • 计算平方以及平方根
      • $ echo "sqrt(100)" | bc
      • $ echo "10^10" | bc
                                </div>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值