美文网首页Linux基础
(转)Linux Shell脚本攻略1:小试牛刀(1)

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

作者: 千幻流光 | 来源:发表于2018-10-19 15:31 被阅读26次

    本文为转载
    作者:数据分析之路
    来源:CSDN
    原文:https://blog.csdn.net/qixizhuang/article/details/77900511


    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 #使用完整路径执行文件
    3. 在Bash中,每个命令或是命令序列是通过分号或换行符来分隔的,如$ cmd1;cmd2
    4. 注释部分以#开始,一直延续到行尾。

    终端打印

    1. echo是用于终端打印的基本命令,在默认情况下,echo在每次调用后会在末尾添加一个换行符。
      • echo打印文本有三种形式

        1. 使用双引号:$ echo "Welcome to Bash"
        2. 使用单引号:$ echo 'Welcome to Bash'
        3. 不使用引号:$ echo Welcome to Bash
      • 三种方法各有些限制

        1. 使用不带引号的echo时,没法在所要显示的文本中使用分号(;),因为分号在Bash中会被识别为命令定界符。
        2. 使用单引号时,变量替换在单引号中无效。如下所示:
          $ echo '$var'会打印出 $var
          $ echo "$var" 会打印出var的值
        3. 使用双引号时,在不使用转义字符()的情况下无法打印!符号。
    2. 另一个可用于终端打印的命令是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. 其他
      • %s、%c、%d和%f都是格式替换符(format substitution character),其所对应的参数可以置于带引号的格式字符串之后。
      • 在使用echo和printf的命令选项时,要确保选项应该出现在命令行内所有的字符串之前,否则Bash会将其视作另外一个字符串。
      • 在默认情况下,echo会将一个换行符追加到输出文本的尾部,可以使用选项-n来忽略结尾的换行符,如$ echo -n "Hello bash"
      • echo同样接受双引号字符串内的转义序列作为参数,如果需要使用转义参数,需要使用-e选项。如$ echo -e "1\t2\t3"

    变量和环境变量

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

    相关文章

      网友评论

        本文标题:(转)Linux Shell脚本攻略1:小试牛刀(1)

        本文链接:https://www.haomeiwen.com/subject/xgryzftx.html