Linux Shell简介
- Shell脚本通常是一个以shebang(#!/bin/bash)起始的文本文件,其中/bin/bash是Bash的解释器命令路径。
- Shell脚本有两种运行方式:
- 一种是将脚本作为bash的命令行参数,如:
$ bash script.sh
#假设脚本位于当前目录下$ bash /home/path/script.sh
#使用脚本的完整路径
- 另一种则是授予脚本执行权限,将其变为可执行文件。
$ chmod a+x script.sh
#赋予脚本执行权限$ ./script.sh;
#使用相对路径$ /home/path/script.sh
#使用完整路径
- 在Bash中,每个命令或是命令序列是通过分号或换行符来分隔的,如
$ cmd1;cmd2
- 注释部分以#开始,一直延续到行尾。
终端打印
- echo是用于终端打印的基本命令,在默认情况下,echo在每次调用后会在末尾添加一个换行符。
- echo打印文本有三种形式
- 使用双引号:
$ echo "Welcome to Bash"
- 使用单引号:
$ echo 'Welcome to Bash'
- 不使用引号:
$ echo Welcome to Bash
- 使用双引号:
- 三种方法各有些限制
- 使用不带引号的echo时,没法在所要显示的文本中使用分号(?,因为分号在Bash中会被识别为命令定界符。
- 使用单引号时,变量替换在单引号中无效。如下所示:
$ echo '$var'
会打印出 $var$ echo "$var"
会打印出var的值
- 使用双引号时,在不使用转义字符()的情况下无法打印!符号。
- 另一个可用于终端打印的命令是printf,printf使用的参数和C语言中的printf函数一样,例如
$ printf "Hello world"
。printf使用引用文本或由空格分隔的参数。 - 我们可以在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
运行上述脚本,我们会得到如下输出:
- %s、%c、%d和%f都是格式替换符(format substitution character),其所对应的参数可以置于带引号的格式字符串之后。
- 在使用echo和printf的命令选项时,要确保选项应该出现在命令行内所有的字符串之前,否则Bash会将其视作另外一个字符串。
- 在默认情况下,echo会将一个换行符追加到输出文本的尾部,可以使用选项-n来忽略结尾的换行符,如
$ echo -n "Hello bash"
。 - echo同样接受双引号字符串内的转义序列作为参数,如果需要使用转义参数,需要使用-e选项。如
$ echo -e "1\t2\t3"
。
变量和环境变量
- 脚本语言通常不需要在使用变量之前声明其类型,只需要直接赋值就可以。
- 在Bash中,每一个变量的值都是字符串,无论给变量赋值时有没有使用引号,值都会以字符串的形式存储。
- 有一些特殊的变量会被shell环境和操作系统环境用来存储一些特别的值,这类变量称为环境变量。
- env命令可以查看所有全局环境变量。
- set命令可以查看所有环境变量。
- unset命令可以针对当前会话删除一个变量。
- 环境变量的配置文件
- 全局:
/etc/prifile
- 局部:
~/.bash_profile
- 全局:
- 对于进程来说,其运行时的环境变量可以使用下面的命令来查看:
$ cat /proc/$PID/environ
#$PID用进程ID替代- 可以使用pgrep命令来获取进程ID,如
$ pgrep gedit
- 上述命令返回一个包含环境变量以及对应变量值的列表,每个列表以name=value的形式来描述,彼此之间由null字符(\0)分隔,如果将\0替换成\n,那么就可以将输出重新格式化,使得每一行显示一组“变量=值”,替换可以使用tr命令。
$ cat /proc/$PID/environ | tr '\0' '\n'
- 变量赋值
var=value
;- 如果value不包含任何空白字符(例如空格),那么它就不需要使用引号进行引用,否则必须使用单引号或双引号。
var = value
不同于var=value
,后者是赋值,前者是相等操作。
- 在变量名之前加上$前缀就可以打印出变量的内容。
$ echo $var
$ echo ${var}
- 我们可以在printf或echo命令的双引号中引用变量值
$ echo "We have $count ${fruit}(s)"
- 环境变量是未在当前进程中定义,而从父进程中继承而来的变量。例如环境变量HTTP_PROXY,定义了互联网连接应该使用哪个代理服务器。
HTTP_PROXY=192.168.1.23:3128
$ export HTTP_PROXY
- export命令用来设置环境变量,至此之后,从当前shell脚本执行的任何应用程序都会继承这个变量。
- 我们可以根据自己的需要,在执行的应用程序或者shell脚本中导出特定的变量,在默认情况下,有很多标准环境变量可供shell使用,PATH就是其中之一。
$ echo $PATH
- 在给出所要执行的命令后,shell会自动在PATH环境变量所包含的目录列表中(各目录路径之间以冒号间隔)查找对应的可执行文件。
$ export PATH="$PATH:/home/user/bin"
#在PATH中添加新路径
- 还有一些众所周知的环境变量,如
- HOME:用户主目录
- PWD:当前路径
- USER:当前用户
- UID:用户的ID号
- SHELL:当前默认shell程序
- 使用单引号时,变量不会被扩展,将依照原样显示,这意味着:
$ echo '$var'
会打印出 $var$ echo "$var"
会打印出var的值
- 获得字符串长度
$ echo ${#var}
- 识别shell
- 默认shell:
$ echo $SHELL
- 当前使用shell:
$ echo $0
- 默认shell:
- 超级用户(root)的UID是0。
- 当我们打开终端或是运行shell时,会看到类似于
user@hostname:/home/$
的提示字符串。不同GNU/Linux发布版中的提示及颜色略有不同。我们可以利用PS1环境变量来定制提示文本。 默认的shell提示文本是在文件~/.bashrc
中的某一行设置的。$ cat ~/.bashrc | grep PS1
$ PS1="PROMPT>"
- 有一些特殊的字符可以扩展成系统参数
\u
可以扩展为用户名\w
可以扩展为当前工作目录\h
可以扩展为主机名
使用Shell进行数学运算
- 在Bash Shell中,可以利用let、(())和[]执行基本的算术操作,而在进行高级操作时,expr和bc这两个工具也会非常有用。
- 可以用普通的变量赋值方法定义数值,这时,它会被存储为字符串,然而我们可以用一些方法使它能像数字一样进行运算。
$ no1=4; no2=5
- let命令可以直接执行基本的算术操作,当使用let时,变量名之前不需要加$,如:
$ let result=no1+no2; echo $result
- 自加操作:
$ let no1++
- 自减操作:
$ let no1--
- 简写形式:
$ let no+=6; let no-=6
- 操作符[]的使用方法和let命令类似:
$ result=$[ no1 + no2]
- 在
[]
中可以使用$
前缀,如:$ result=$[$no1 + 5]
- 使用
(())
和[]
类似:$ result=$(( no1 + 50 ))
- 在
(())
中也可以使用$
前缀,如:$ result=$(( $no1 + 50 ))
- expr同样可以用于基本算术操作:
$ result=`expr 3 + 4`
$ result=$(expr $no1 + 5)
- let、(())和[]只能用于整数运算,不支持浮点数。
- bc是一个用于数学运算的高级工具,这个精密计算器包含了大量的选项,我们可以借助它执行浮点数运算并应用一些高级函数。
$ echo "4 * 0.56" | bc
$ no=54; result=`echo "$no * 1.5" | bc`; echo $result
- 其他参数可以置于要执行的具体操作之前,同时以分号作为定界符,通过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>