Shell脚本之 笔记一

一、基础

  • 脚本开头 像 #!/bin/sh,它同样也可以改为 #!/bin/bash

  #!  是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell

  • 运行shell  (chmod +x file 加上执行权限,否则会提示无执行权限)

    一定要写成 ./test.sh,而不是 test.sh运行其它二进制的程序也一样,直接写 test.sh

    linux 系统会去PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目    通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找

  • 作为解释器参数运行脚本(这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。)

    /bin/sh test.sh

    /bin/php test.php

  • ubuntu(linux)下 source、sh、bash、./ 执行脚本的区别是什么?
  1. source filename (在当前 bash 环境下读取并执行 FileName 中的命令。该 filename 文件可以无 "执行权限")
  2. sh filename 或 bash filename (:打开一个子 shell 来读取并执行 FileName 中命令。该 filename 文件可以无 "执行权限")
  3. ./ filename    (打开一个子 shell 来读取并执行 FileName 中命令,该 filename 文件需要 "执行权限")注:运行一个 shell 脚本时会启动另一个命令解释器。

二.变量

  1.定义变量时,变量名不加美元符号($,PHP语言中变量需要) 如  name="job"

  注意,变量名和等号之间不能有空格,

  2.使用变量(已定义),只要在变量名前面加美元符号即可   echo  ${name}

    echo "I am good at ${skill}Script"

    变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界

     推荐给所有变量加上花括号,这是个好的编程习惯

   3.只读变量 (使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变)

    #!/bin/bash
    myUrl="https://www.google.com"
    readonly myUrl
    myUrl="https://www.runoob.com"

  4.删除变量     unset variable_name  

   5.变量类型  局部变量\环境变量\shell变量

   6.字符串   (字符串可以用单引号,也可以用双引号,也可以不用引号)

   str='this is a string'

  单引号: 任何字符原样输出,字符串内变量 无效.  字符串中不能出现单独的单引号,转义也不行.

    可成对出现用作字符拼接

  双引号: 双引号里面可以有变量,    双引号里面可以出现转义字符

  str="Hello, I know you are \"$your_name\"! \n"

  7.获取字符串长度  string="abcde"      字符串有   

    echo ${#string}    #输出5     变量为数组时,${#string} 等价于 ${#string[0]}:

    expr  length "$string"    #计算字符串长度

    注意:字符串里面有空格的话,需要加双引号,便于length计算字符串长度

  8.提取子字符串

    echo ${string:1:4}    #从第2字符开始截取4个字符(注意:第一个字符的索引值为 0)

    echo ${string:7}   #从左边第8个开始到结束

    echo ${string:0-7:3}  #  0-7表示从右边算第七个开始, :3表示字符个数

    echo ${string:0-7}   #从右数第7个开始到结束(左边第一个用0表示,右边第一个用0-1表示)

    echo ${var#*//}   #  变量var  #是运算符,   *// 表示从左边开始 删除第一个//左边的所有

    # 表示删除指定字符的左边 (%  表示从右边)

    ##表示删除指定字符的左边  (%% 表示从右边)

 

  9.查找子字符串 (注意: 以上脚本中 ` 是反引号,而不是单引号 ')

    string="runoob is a great site"

    echo  `expr index "$string"  io`   # 输入4    查找字符i或o的位置,计算先出现的那个

  10.数组  (bash只支持一维数组.   用括号来表示数组,元素之间用"空格"符号分割开)

    数组名=(值1  值2  值3 ...值n)    my_array=(a  b  "c"  d)

    读取数组   ${数组名[下标]}   例:value=${array_name[n]}

    echo ${array_name[@]}    #使用@获取数组所有元素

    length=${#array_name[@]}    #获取数组元素个数

    length=${array_name[*]}    #获取数组元素个数

    length=${arrya_name[n]}    #获取单个元素的长度

    关联数组  (用 declare 来声明)   例:declare  -A  array_name  (#  -A 用于声明关联数组)

 

 

  11.注释     以 #  开头的就是注释

    多行注释     (:<< 自定义字符   ...   自定义字符)

    :<<EOF

    ...

    EOF

  12. expr  使用此命令时,运算符左右必须加空格.( 乘法需要转义   *  写成 \*)

  13.read     用于获取键盘输入信息    read  [-option] [variable]    (-p 后面写 提示信息)

  read -p "input a val:" a    #获取键盘输入的 a 变量数字
  read -p "input b val:" b    #获取键盘输入的 b 变量数字
  r=$[a+b]                    #计算a+b的结果 赋值给r  不能有空格
  echo "result = ${r}"        #输出显示结果 r

  14.shell  传递参数  ($n,n代表数字,第几个参数)  含有空格的参数,只需要在参数传递的时候加双引号就可以

    $0  表示执行的文件名

    $1 第一个参数,$2 第二个参数

    其他参数:

    $#  传递的参数个数

    $*  以单字符串显示所有参数  ($@相同,使用时加引号,能返回每个参数)

    $$  当前脚本的进程ID号   /     $!  后台运行的最后一个进程的ID号

    $-  显示shell的当前选项,与set命令功能相同

    $?  显示最后命令的退出状态.    0表示无错误,其他任何表名有错误

 

  15.运算符   (Shell 里面的中括号(包括单中括号与双中括号)可用于一些条件的测试)

     中括号 [] 与其中间的代码应该有空格隔开

    两个数相加(注意使用的是反引号 ` 而不是单引号 ')完整的表达式要被 ` ` 包含

    乘号(*)前边必须加反斜杠(\)才能实现乘法运算

    原生bash不支持简单的数学运算,可用其他命令实现,例如 awk 和 expr,expr 最常用

    算术比较:  [$var  -eq  0  ]    #变量是否为0

    文件属性测试  [ -e  $var ]  #文件是否存在  /   [ -d  $var ]  #是否是目录

    字符串比较  [[ $var1 = $var2  ]]

    []  可以用 test 命令 代替

 

posted @ 2023-04-29 02:47  csip  阅读(25)  评论(0编辑  收藏  举报