Linux Shell脚本攻略1:小试牛刀(1)

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
超级用户(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
————————————————

原文链接:https://blog.csdn.net/qixizhuang/article/details/77900511

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值