• Shell脚本系列教程二: 开始Shell编程


    Shell脚本系列教程二: 开始Shell编程

    2.1 如何写shell script?

    (1) 最常用的是使用vi或者mcedit来编写shell脚本, 但是你也可以使用任何你喜欢的编辑器;

    (2) 脚本写好之后, 要给脚本设置可执行权限: 语法为: chmod  [option]  mode  script-name

    $ chmod +x script-name  # 对所有用户(a, 默认)
    $ chmod 775 script-name

    这里, 775这3个数字分别表示此文件对于用户(u), 组(g), 其他用户(o)的权限设置, 比如: 第一个7,二进制为111,表示分别表示赋予了用户此文件的读, 写, 执行权限; 

    who: u(用户), g(组), o(其他), a(所用用户, 默认);  opcode: +(增加权限), -(删除权限), =(重新分配权限);  permission: r(读权限), w(写权限), x(执行权限), s(设置用户ID号), t(粘着位)

    1 $ chmod u+x file      # 给此file的用户添加执行权限
    2 $ chmod 751           # 给此file的用户读写执行权限,file所在组读,执行权限,其他用户执行权限
    3 $ chmod u=rwx,g=rx,o=x file  # 和上一条语句含义相同
    4 $ chmod =r file           # 给所有用户分配读权限(默认的用户为a,这里就是默认了)
    5 $ chmod 444 file        # 和上条语句完全相同
    6 $ chmod a-wx,a+r file  # 同上条语句, - 表示去除权限
    7 $ chmod +R u+r directory  # 递归地给directory目录下所有文件和子目录分配读的权限

    (3) 使用下面的命令来执行脚本: 

    $ bash script-name 或 $ sh script-name 或 $ ./script-name (你的终端当前路径是本脚本所在路径, 但是还是要加上"./", 这样才会从当前文件夹来找这个文件);如果只有一个.(dot)表示在当前的shell里面执行给定的文件: 语法为: . command-name (可以参考[2]).

    下面, 写下自己的第一个shell脚本: 命名为first

    $ clear
    $ echo "Hello World"

    对脚本进行保存之后,你可能会使用下面的命令来执行脚本:

    $ ./first

    这种方式不得行,因为这个脚本现在还没有执行权限,要给脚本加上执行权限方可执行: 屏幕会被清空,Hello World将会被打印到屏幕上.

    $ chmod 775 first
    $ ./first 
    脚本命令 含义
    clear 清空屏幕
    echo "Hello World" 在屏幕上输出信息或者变量的值,这里使echo命令的一般使用方法: echo "Message"

    练习: 写如下的脚本, 保存然后执行, 观测输出

    ginfo

    1 clear
    2 echo "Hello $USER"
    3 echo "Today is c";date
    4 echo "Number of user login :c";who | wc -l
    5 echo "Calendar"
    6 cal
    7 exit 0

     输出:

    Hello wang
    Today is c
    2016年 11月 04日 星期五 10:36:15 CST
    Number of user login :c
    2
    Calendar
          十一月 2016        
    日 一 二 三 四 五 六  
           1  2  3  4  5  
     6  7  8  9 10 11 12  
    13 14 15 16 17 18 19  
    20 21 22 23 24 25 26  
    27 28 29 30    

    2.2 Shell中的变量

    在Linux(Shell)中, 有两种类型的变量:

    1) 系统变量: 由Linux自定义和生成的, 都是用大写字母.

    2) 用户定义的变量(UDV): 由用户定义和生成的变量.

    一些重要的系统变量如下表所示:

    系统变量 含义
    BASH shell所在路径: 如/bin/bash, 此命令和SHELL相同
    BASH_VERSION shell的版本,如: 4.3.11(1)-release
    COLUMNS 你的终端的coloums, 如80; 我电脑上,终端最大化后, 此值变成205
    HOME 电脑的home路径, 如/home/wang
    LINES 和COLUMNS含义差不多
    LOGNAME 当前用户名称, 如wang
    OSTYPE Os类型: 如linux-gnu
    PATH 我们的路径设置
    PS1 Our prompt settings
    PWD 当前的工作路径
    SHELL shell所在路径: 如/bin/bash
    UESRNAME 当前登陆到这台PC的用户名称

    如果想要打印输出当前的home路径, 可以:

    $ echo $HOME      # 输出: /home/wang

    但是下面可以这样吗? 下面这条命令是ok的, 不会出现任何错误, 但是它会输出HOME, 而不是HOME所指代的内容, 要在HOME前面加上$才行.

    $ echo HOME    # 输出: HOME

    2.3 如何定义/输出用户定义变量

    用户定义自己的变量: 语法: variable name=value

    $ no=10   # 正确
    $ 10=no   # 错误, 值必须在等号的右侧
    $ vech=Bus  # Bus是个字符串
    $ n=10

    准则: 1)变量名的定义必须以字母或者下划线开头;2)赋值的时候,等号的左右侧都不能有空格;3)变量名对大小写敏感;4)可以定义NULL变量;5)变量名里面不能有*,?等.

    # 2) 等号的左右不能有空格
    $ n =10 n: command not found $ n= 10 10: command not found $ n = 10 n: command not found $ n=10 # 正确
    # 3)变量名对大小写是敏感的,下面这四个变量是不相同的!!
    $ no=10  
    $ No=34
    $ NO=45
    $ nO=32
    # 4) 定义NULL变量
    $ vech=
    $ vech=""
    # 5) 变量名里面不能有*
    $ a*=4 a*=4: command not found

    如何打印输出自定义变量?

    定义变量vech和n,然后打印输出(在变量名前面加上$):

    $ vech=Bus
    $ n=10
    $ echo vech
    Bus
    $ echo $n
    10
    $ echo vech # 这里没有输出vech的内容,而是把vech当做是字符串
    vech

    练习:

    1.定义变量x的值为10,并且打印到屏幕:

    $ x=10
    $ echo $x
    10

    2.定义变量xn的值为Rani,并且打印到屏幕:

    $ xn=Rani
    $ echo $xn
    Rani

    3.如何打印输出两个数:6和3之和?

    $ echo `expr 6 + 3`  # +两边有空格
    9 
    $ echo `expr 6+3`    # +两边忘记加空格了
    6+3

    4.定义两个变量x=20,y=5,打印输出x除以y的值:

    $ x=20
    $ y=5
    $ echo `expr $x / $y`    # /的两边同样要有空格

    5. 将4中的x/y的值赋值给z:

    $ z=`expr $x / $y`
    $ echo $z
    4

    2.4 echo命令

    echo命令用于显示文本或者变量的值:echo [options] [string, variables ...]

    options:

    -n 

    -e  表示在字符串中启用下面的这些制表符:

    a  发出"噔"的一声警告!

      backspace删除键

    $ echo -e "HelloBaby"
    HellBaby

    c  

     开新行

    $ echo -e "Hello
    Baby"  # 两行显示
    Hello
    Baby

     回车

     水平制表符; $ echo -e "Hello Baby" output: Hello Baby $ echo -e Hello Baby output: HellotBaby 

    \  输出一个\,前一个是转义:  echo \ 得到:

    2.5 Shell算术运算

    语法: expr op1 math-operator op2  # 1)用expr; 2)运算符两边都有空格

    $ expr 1 + 3
    4
    $ expr 2 - 1
    1
    $ expr 10 / 2
    5
    $ expr 20 % 3
    2
    $ expr 10 * 3  # 特别注意,乘号需要转义
    30
    $ echo expr 6 + 3  # 看看这个是什么原因?
    expr 6 + 3
    $ echo "expr 6 + 3"  # 看看这个是什么原因?
    expr 6 + 3
    $ echo 'expr 6 + 3'  # 看看这个是什么原因?
    expr 6 + 3
    $ echo `expr 6 + 3`  # 这个才是正确的
    9

    注意最后一条语句,正确的写法应该是:$ echo `expr 6 + 3` .注意,这里用的不是单引号,更不是双引号,而是后引号(``).当一个命令被后引号引住的时候,此命令将被执行,我们将得到它的输出.

    2.6 读语句(read)

    从键盘上读取数据存放在变量中: 语法: read var1, var2, ..., varN

    编写下面的脚本文件, 提示用户输入名字, 用户使用键盘输入名字, 存放在指定的变量中, 然后显示:

    $ vi sayH
    echo "Your first name please: "
    read fname   # 用户的输入存放在fname里面!!!
    echo "Hello $fname, Lets be friend!"

    执行下面的语句运行sayH:

    $ chmod +x sayH
    $ ./sayH

    Your first name please:
    Zhao
    Hello Zhao, Lets be friend!

    通配符


    参考文献:

    [1] Linux Shell Scripting Tutorial: http://www.freeos.com/guides/lsst/index.html

    [2] http://blog.csdn.net/mci2004/article/details/7182829

  • 相关阅读:
    2019牛客暑期多校训练营(第二场)
    2019牛客暑期多校训练营(第一场)
    JOISC2014 挂饰("01"背包)
    UPC 2019年第二阶段我要变强个人训练赛第十六场
    UPC个人训练赛第十五场(AtCoder Grand Contest 031)
    Wannafly挑战赛15 C“出队”(约瑟夫环类问题)
    UVA 133“The Dole Queue”(循环报数处理技巧)
    洛谷P1169 [ZJOI2007]棋盘制作 悬线法 动态规划
    洛谷P1273 有线电视网 树上分组背包DP
    CF1097D Makoto and a Blackboard 质因数分解 DP
  • 原文地址:https://www.cnblogs.com/zhao441354231/p/6024889.html
Copyright © 2020-2023  润新知