加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_宿迁站长网 (https://www.0527zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux基础4-Shell语法

发布时间:2022-09-17 15:16:58 所属栏目:Linux 来源:
导读:  #! /bin/bash
  来指明bash为脚本解释器。

  1 概论1.1 脚本示例

  #! /bin/bash
  echo "Hello World!"
  1.2 运行方式

  # 第一种
  chmod +x test.sh # 使脚本具有可执行权限
  #! /bin/bash
  来指明bash为脚本解释器。
 
  1 概论1.1 脚本示例
 
  #! /bin/bash
  echo "Hello World!"
  1.2 运行方式
 
  # 第一种
  chmod +x test.sh # 使脚本具有可执行权限
  ./test.sh # 当前路径下执行
  # 第二种
  bash test.sh # 用解释器输出
  2 注释2.1 单行注释
 
  每行中#之后均为注释.
 
  # 这是一个注释
  echo "My name is yrx" # 这也是一个注释
  2.2 多行注释
 
  格式:
 
  :<
  其中EOF可以替换为任意其它字符串。例如:
 
  :<
  3 变量3.1 定义变量
 
  定义变量,不需要加 $ 符号,例如:
 
  name1='yrx' # 单引号定义字符串
  name2="yrx" # 双引号定义字符串
  name3=yrx   # 不加引号定义字符串
  定义变量时,等号两边不能有空格;定义变量的时候变量都是字符串,但当变量需要是整数时,会自动把变量转换成整数;被声明为只读的变量无法被unset删除;bash可以用来开一个新的进程,exit或ctrl+d退出新的bash;字符串中,不加引号和双引号效果相同.3.2 使用变量
 
  使用变量,需要加上 \$ 符号,或者 \${} 符号。花括号是可选的,主要为了帮助解释器识别边界。
 
  name=yrx
  echo $name          # 输出yrx
  echo ${name}        # 输出yrx
  echo ${name}dfjb    # 输出yrxdfjb
  3.3 只读变量
 
  使用readonly或者declare可以将变量变为只读。
 
  name=yrx
  readonly name
  declare -r name    # 两种方法都可以
  name=yxr           # 会报错
  3.4 删除变量
 
  unset可以删除变量。
 
  name=yrx
  unset name
  echo $name  # 输出空行
  3.5 变量类型自定义变量(局部变量)——子进程不能访问的变量。环境变量(全局变量)————子进程可以访问的变量。
 
  自定义变量改成环境变量:
 
  name=yrx        # 定义变量
  export name     # 第一种办法
  declare -x name # 第二种办法
  环境变量改为自定义变量
 
  export name=yrx # 定义环境变量
  declare +x name # 改为自定义变量
  tmux经ctrl a + % 分屏得到的两个界面实际上是两个bash,在一个bash中自定义的bash变量仅可以被当前bash访问,通过bash命令开启的子进程也无法访问。export后变量变为环境变量,就可以被全局访问。
 
  3.6 字符串
 
  字符串可以用单引号、双引号、不用引号来定义。
 
  单引号与双引号的区别:
 
  name=yrx
  echo 'hello, $name \"hh\"' # hello, $name \"hh\"
  echo "hello, $name \"hh\"" # hello, yrx "hh"
  获取字符串长度:
 
  name="yrx"
  echo ${#name} # 3
  提取子串:
 
  name="hello,yrx"
  echo ${name:0:5} # 提取从0开始的5个字符
  4 默认变量4.1 文件参数变量
 
  在执行shell脚本时,可以向脚本传递参数。\$1是第一个参数,\$2是第二个参数,依此类推。
 
  特殊地,\$0是文件名(包含路径)。
 
  #! /bin/bash
  echo "filename:"$0
  echo "first var:"$1
  echo "second var:"$2
  echo "third var:"$3  
  执行:(可以传入参数)
 
  chmod +x knowar.sh
  ./knowvar.sh 1 4 6
  filename:./knowvar.sh
  first var:1
  second var:4
  third var:6
  4.2 其它默认变量 网页版格式有误!
 
  参数说明
 
  \$#
 
  代表传入参数的个数。
 
  \$*
 
  由所有参数构成的用空格隔开的字符串。
 
  \$\@
 
  每个参数分别用双引号括起来的字符串。
 
  \$\$
 
  脚本当前运行的进程ID。
 
  上一条命令的退出状态(不是stdout,是exit code),0表示正常退出,其他值表示错误。
 
  \$(command)
 
  返回command这条命令的stdout 可嵌套。
 
  'command'
 
  返回command这条命令的stdout 不可嵌套。
 
  5 数组
 
  数组中可以存放多个不同类型的值,只支持一维数组,初始化时不需要指明数组大小。
 
  数组下标从0开始。
 
  5.1 定义
 
  数组用小括号表示,元素之间用空格隔开。
 
  array=(1 abc "def" yrx)
  也可以直接定义数组中某个元素的值。
 
  array[0]=9
  array[1]=pp
  array[2]="qq"
  array[3]=dfjb
  5.2 读取数组中某个元素的值
 
  格式:
 
  ${array[index]}
  例如:
 
  array=(1 abc "def" dfjb)
  echo ${array[0]}
  echo ${array[1]}
  echo ${array[2]}
  echo ${array[3]}
  5.3 读取整个数组
 
  格式:
 
  ${array[@]} # 第一种写法
  ${array[*]} # 第二种写法
  5.4 数组长度
 
  类似于字符串。
  
  ${#array[@]}
  ${#array[*]}
  6 expr命令6.1 格式
 
  expr命令用于求表达式的值,格式为:
 
  expr 表达式
  表达式说明:
 
  用空格隔开每一项;把反斜杠放在shell特定的字符面前(发现表达式运行错误时,可以试试转义);对包含空格和其他特殊字符的字符串要用引号括起来;expr会在stdout中输出结果。如果为逻辑关系表达式,则结果为真,stdout为1linux语句,否则为0;expr的exit code:如果为逻辑关系表达式,则结果为真,exit code为0,否则为1.6.2 字符串表达式
 
  #! /bin/bash
  str="Hello world!"
  echo `expr length "$str"`       # 不是单引号,是左上角的符号,表示执行这个命令
  echo `expr index "$str" awl`
  echo `expr substr "$str" 3 5`
  12
  3
  llo w 注意从0开始!
  6.3 算术表达式
 
  expr支持普通的算术操作,算术表达式优先级低于字符串表达式,高于逻辑关系表达式。
 
  #! /bin/bash
  a=15
  b=7
  echo `expr $a + $b`                         #22
  echo `expr $a - $b`                         #8                               
  echo `expr $a \* $b`                        #105
  echo `expr $a / $b`                         #2
  echo `expr $a % $b`                         #1
  echo `expr \( $a + 1 \) \* \( $b - 1 \)`    #96
  6.4 逻辑关系表达式
 
  a=3
  b=4
  echo `expr $a \> $b`  # 输出0,>需要转义
  echo `expr $a '<' $b`  # 输出1,也可以将特殊字符用引号引起来
  echo `expr $a '>=' $b`  # 输出0
  echo `expr $a \<\= $b`  # 输出1
  c=0
  d=5
  echo `expr $c \& $d`  # 输出0
  echo `expr $a \& $b`  # 输出3
  echo `expr $c \| $d`  # 输出5
  echo `expr $a \| $b`  # 输出3
  7 read命令
 
  read命令用于从标准输入中读取单行数据。当读到文件结束符时,exit code为1,否则为0。
 
  参数说明:
 
  -p:后面可以接提示信息;-t:后面跟秒数,定义输入字符的等待时间,超过等待时间后会自动忽略此命令。
 
  示例:
 
  read name
  yrx
  echo $name
  yrx
  read -p "Enter your name:" -t 30 name
  Enter your name:yrx
  read -p "Enter your name:" -t 5 name
  8 echo命令8.1 输出格式
 
  echo用于输出字符串。格式:
 
  echo STRING
  原样输出字符串,不进行转义或取变量:
 
  name=yrx
  echo '$name\"' # 单引号
  显示命令的执行结果:
 
  echo `date` # 左上角的那个点
  8.2 显示字符串
 
  普通字符串:
 
  echo "Hello world!"
  echo Hello world! # 引号可以省略
  转义字符:
 
  echo " \"Hello world! \" "
  echo \"Hello world! \"
  8.3 显示变量
 
  name=yrx
  echo "My name is ${name}"
  8.4 显示换行/不换行
 
  显示换行:
 
  echo -e "hi\n" # \n换行
  echo "yrx"
  输出:
 
  hi
  yrx
  显示不换行:
 
  echo -e "Hi \c" # \c 不换行
  echo yrx
  输出:
 
  Hi yrx
  8.5 显示结果定向至文件
 
  echo "Hello world" > output.txt # 将内容以覆盖的方式输出到output.txt
  9 printf命令
 
  printf命令用于格式化输出,类似于C/C++中的printf函数。
 
  默认不会在字符串末尾添加换行符。
 
  格式:
 
  printf format-string [arguments...]
  示例:
 
  printf "d.\n" 123                      #       123.
  printf "%-10.2f.\n" 123.45678             #123.46    .
  printf "My name is %s\n" "yrx"            #My name is yrx
  printf "%d + %d = %d\n" 2 3 `expr 2 \+ 3` #2 + 3 = 5
  10 test命令与判断符号[]10.1 逻辑运算符10.2 test命令在命令行中输入man test,可以查看test命令的用法。 test命令用于判断文件类型,以及对变量作比较。 test命令用exit code返回结果,而不是使用stdout。0表示真,非0表示假。
 
  test 2 -lt 3
  echo $?       # 0,$?输出上一条命令的返回值
  tets 2 -gt 3  
  echo $?       # 1
  ls
  homework  output.txt  test.sh  tmp
  test -e test.sh && echo "exist" || echo "Not exist"
  exist  # test.sh 文件存在
  test -e test2.sh && echo "exist" || echo "Not exist"
  Not exist  # testh2.sh 文件不存在
  10.3 文件判断
 
  文件类型判断:
 
  test -e filename # 文件是否存在
  test -f filename # 是否为文件
  test -d filename # 是否为目录
  文件权限判断:
 
  test -r filename # 判断文件是否可读
  test -w filename # 可写
  test -x filename # 可执行
  test -s filename # 是否为空文件
  10.4 整数间的比较
 
  test $a -eq $b # 是否相等
  -eq   # 等于
  -ne   # 不等于
  -gt   # 大于
  -lt   # 小于
  -ge   # 大于等于
  -lt   # 小于等于
 
  10.5 字符串比较
 
  test -z STRING    # 判断STRING是否为空,如果为空,返回true
  test -n STRING    # 判断STRING是否非空,如果非空,返回true(-n可以省略)
  test str1 == str2 # 判断两字符串是否相等
  test str1 != str2 # 判断两字符串是否不相等
  10.6 多重条件判定
 
  test -r filename -a -x filename # 两条件是否同时成立
  -a
  -o # 至少一个成立
  !  # 取反
  10.7 符号判断[]
 
  []与test的用法几乎一样,更常用于if语句中。另外 [ [ ] ]是[]的加强版,支持的特性更多。
 
  例如:
 
  [ -2 -lt 3 ]  # 为真,返回0
  echo $?       # 0
  ls
  homework  output.txt  test.sh  tmp
  [ -e test.sh ] && echo "exist" || echo "Not exist"
  exist  # test.sh 文件存在
  [ -e test2.sh ] && echo "exist" || echo "Not exist"
  Not exist  # testh2.sh 文件不存在
  注意:
 
  例如:
 
  name="dfjb yrx"
  [ $name == "dfjb yrx" ]  # 错误,中间有空格
  [ "$name" == "dfjb yrx" ]  # 正确
  11 判断语句
 
  if...then
 
  11.1 单层if
 
  if condition
  then
      语句1
      语句2
      语句2
      ...
  fi
  示例:
 
  #! /bin/bash
  a=3         
  if [ $a -gt 2 ]              
  then     
      echo `expr ${a} + 2`
  fi
  11.2 if-else
 
  if condition
  then
      语句1
      语句2
      ...
  else
      语句1
      语句2
      ...
  fi
  示例:
 
  #! /bin/bash
  a=3  
  if [ $a -gt 3 ]
  then
      echo `expr ${a} + 2`
  else
      echo `expr ${a} \* 2 `
      echo hhh
  fi
  11.3 多层if-elif-elif-else
 
  if condition
  then
      语句1
      语句2
      ...
  elif condition
  then
      语句1
      语句2
      ...
  elif condition
  then
      语句1
      语句2
      ...
  else
      语句1
      语句2
      ...
  fi
  示例:
 
  #! /bin/bash
  read -p "score 0-100 :" score
  if [ $score -gt 90 ]
  then
      echo "very good"
  elif [ $score -gt 60 ]
  then
      echo good
  else
      echo bad
  fi  
  11.4 case-esca形式
 
  类似于C/C++中的switch语句。
 
  命令格式:
 
  case $变量 in
      值1)
          语句1
          语句2
          ...
          ;;     # 相当于break
      值2)
          语句1
          语句2
          ...
          ;;
      *)        # 相当于default
          语句1
          语句2
          ...
          ;;
  esac
  示例:
 
  #! /bin/bash
  read -p "score 1-4 :" score
  case $score in
      3)                                                                        
          echo "very good"
          echo "${score}"
          ;;
      2)
          echo "good"
          ;;
      1)
          echo "bad"
          ;;
      *)
          echo "very bad"
          ;;
  esac
  12 循环语句
 
  13 函数
 
  14 exit命令
 
  15 文件重定向
 
  16 引入外部脚本
 

(编辑:云计算网_宿迁站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!