gbless 发表于 2018-8-21 09:16:30

Shell脚本重新学习

  #!/bin/bash
  
  shell的两种运行方式
  改变权限chmod u+x
  运行时指定解释器
  shell变量
  变量类型
  访问变量
  $、${}
  只读变量
  readonly
  删除变量
  unset取消变量,但不能取消只读变量
myUrl="http://lingdandan.blog.51cto.com"  
unset myUrl
  
echo $myUrl
  运行结果:

myUrl="  
readonly myUrl
  
unset myUrl
  
echo $myUrl
  运行结果:

  shell字符串
  字符串可以用单引号,也可以用双引号,也可以不用引号
  单引号
  单引号中的字符都会原样输出
  单引号中间不能有单引号(转义字符也不行)
  双引号
  双引号里面可以有变量
  单引号可以有转义字符
  字符串拼接
  LANGUAGE=English
  echo "hello ${LANGUAGE}"
  字符串长度计算
  echo ${#VAR}
  echo ${VAR} | wc -c
  echo $TEST_SHELL_VAR | awk '{print length ($0)}'
  提取子字符串
  #*字符
  ##*字符
  %字符*
  %%字符*
  
  VAR代表变量
  ${VAR:0:10}表示从左边第一个字符开始之后的10个字符
  ${VAR:7}    表示从第七个字符开始之后的所有字符
  ${VAR:0-3:10} 表示从右边数的第三个字符开始之后的10个字符
  ${VAR:0-14}表示从右边数的第14个字符开始之后的所有字符
  
  查找字符串
  Shell数组
  数组定义
  bash只支持一维数组,不支持多维
  下标从0开始,可以是整数或者表达式
  arr=(值1 值2 值3)      圆括号   空格隔开
  也可以单独定义各个分量
  数组读取
  ${arr[下标]}
  使用@可获得数组的所有元素

  获取数组长度
  ${#arr[@]}
  ${#arr
[*]}
  
  
  shell传参
  脚本内获取参数的格式:$n
  $0 $1 $2

  $*和$@都是引用所有参数,它们的区别在于$*把参数当作一个字符串,$@把参数当作一个一个的字符串
  $*"1 2 3"   只传了一个参数
  $@"1" "2" "3"传来三个参数

  shell基本运算
  原生的bash不支持简单的算术运算,可通过别的命令如awk和expr来完成
  算数运算
  + - * / % = == !=
  VAR=`expr 3 \* 5`
  关系运算符
  -eq -nq -gt -lt -ge -le
  关系运算符只支持数,不支持字符串

  字符串运算
  =   !=   -z-n   str
  exprhttp://lingdandan.blog.51cto.com/10697032/1791485
  expr match 字符串 表达式    expr 字符串 : 表达式
  expr index 字符串 字符
  expr length 字符串
  expr substr 字符串 偏移量 长度(偏移量从1开始)
  布尔运算
  ! -o -a
  逻辑运算符
  && ||
  文件测试运算符
  [ -f file ] -d-b-c-p-r-w-x-s(文件是否大于0)-e(目录或文件是否存在)
  shell echo命令
  1、echo "str"
  echo str
  2、echo "\"str\""
  3、echo -e "hello \nworld"      #-e开启转义    换行
  4、echo -e "hello \c"       #-e开启转义   不换行 抑制输出结果中的换行字符
  echo "world"
  5、echo "$var is good!"
  6、echo "hello world" >file
  7、echo '$var is good!'    #原样输出字符串不进行转义,使用单引号
  8、echo `date`#显示命令结果
  
  shell printf
  默认printf不会像 echo 自动添加换行符,我们可以手动添加 \n
  语法:printf 格式控制字符串 参数列表
  
  shell test命令
  数值测试 -eq -ne -ge -le -gt -lt
  字符串测试 = != -z -n
  文件测试 -d -f -c -b -r -w -x -e -s
  
  shell 流程控制
  if
  for
  for 变量 in 列表
  do
  done
  for var in list1 list2 list3...
  do
  command
  done
  或者写成一行for var in list1 list2;do command1;command2; done;

  while
  until
  case
  break
  continue
  
  shell函数
   func[()]
  {
  action
  
  }
  函数返回值,可以显示的加return,如果不加将以最后一条命令的结果,作为返回值,
  return后面跟的数为0-255
  下图为加return和不加return的区别


  return的范围

  函数参数
  在函数内部通过$1 $2 $3 ...${10}... 来获取参数
  $# 传递到脚本的参数个数
  $* 以一个单字符串显示所有向脚本传递的参数
  $$ 当前进程的ID
  $! 后台运行的最后一个进程ID
  $@ 和$*相同
  $- 记录当前设置的shell选项 himBH是默认值 http://kodango.com/explain-shell-default-options
  $? 获取退出码
  shell输入输出重定向
  command >file 将输出重定向到file
  command >file将输出追加到file
  n >file   将文件描述符为n的文件重定向到file
  n >>file    将文件描述符为n的文件追加到file
  n >&m      将输出文件m和n合并
  n
页: [1]
查看完整版本: Shell脚本重新学习