shell编程学习篇-Shell变量

参考shell编程:https://www.runoob.com/linux/linux-shell-variable.html
定义变量
  定义变量  变量前不加$美元符号(php语言中需要添加)
命名规则
  与Java命名规则相同
  1.不能以下划线、空格、数字、特殊符号开头
  2.不能使用bash关键字
使用变量:声明变量后,如果使用变量只需要在变量前面加$符号即可
  test_name="aa"
  echo $test_name
只读变量:使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。


运行的结果如下

删除变量:unset
  unset variable_name
三种变量类型
  1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
  2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
  3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
单引号:不会转义,不列举例子
  单引号字符串的限制:
  单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
多引号:可以转义,不列举例子
  双引号的优点:
  双引号里可以有变量
  双引号里可以出现转义字符
获取字符串长度
  ${#string}
提取子字符串
  ${String:index_start-1:char_account}
  列入从第二个字符开始截取6个字符
  ${string:1:6}
查找子字符串
  expr index "$string" +查到的某个字符串
shell数组:bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
  数组名=(值1,值2.....)
  例:array_name=(value1,value2......)
读取数组
  读取数组元素值的一般格式是:
  ${数组名[下标]}
  例${array_name[0]}
获取数组长度的方法与获取字符串长度的方法相同,例如:
  # 取得数组元素的个数
  length=${#array_name[@]}
  # 或者
  length=${#array_name[*]}
  # 取得数组单个元素的长度
  lengthn=${#array_name[n]}      
Shell 注释
  以 # 开头的行就是注释,会被解释器忽略。
  通过每一行加一个 # 号设置多行注释
多行注释
  多行注释还可以使用以下格式:
  :<<EOF
  注释内容...
  注释内容...
  注释内容...
  EOF
shell传递参数
  脚本内获取参数的格式为:$n。n 代表一个数字,0代表执行的文件名,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
  $#	传递到脚本的参数个数
  $*	以一个单字符串显示所有向脚本传递的参数。
            如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
  $$	脚本运行的当前进程ID号
  $!	后台运行的最后一个进程的ID号
  $@	与$*相同,但是使用时加引号,并在引号中返回每个参数。
            如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
  $-	显示Shell使用的当前选项,与set命令功能相同。
  $?	显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
shell数组
  声明array_name=(value1 value2......)或array_name[0]=value1 array_name[1]=value2......
  取值      ${array_name[0]}
  取元素个数 ${#array_name[*]}或 ${#array_name[@]}
shell基本运算符
  Shell 和其他编程语言一样,支持多种运算符,包括:
  算数运算符
  关系运算符
  布尔运算符
  字符串运算符
  文件测试运算符
  原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
  expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
  1.算术运算符:与java相同    需要expr
  +	加法	`expr $a + $b` 结果为 30。
  -	减法	`expr $a - $b` 结果为 -10。
  *	乘法	`expr $a \* $b` 结果为  200。
  /	除法	`expr $b / $a` 结果为 2。
  %	取余	`expr $b % $a` 结果为 0。
  =	赋值	a=$b 将把变量 b 的值赋给 a。
  ==	相等。用于比较两个数字,相同则返回 true。	[ $a == $b ] 返回 false。
  !=	不相等。用于比较两个数字,不相同则返回 true。	[ $a != $b ] 返回 true。
  2.关系运算符:与java相同
  -eq   ==	检测两个数是否相等,相等返回 true。	[ $a -eq $b ] 返回 false。
  -ne   !=	检测两个数是否不相等,不相等返回 true。	[ $a -ne $b ] 返回 true。
  -gt   >	检测左边的数是否大于右边的,如果是,则返回 true。	[ $a -gt $b ] 返回 false。
  -lt   <	检测左边的数是否小于右边的,如果是,则返回 true。	[ $a -lt $b ] 返回 true。
  -ge   >=	检测左边的数是否大于等于右边的,如果是,则返回 true。	[ $a -ge $b ] 返回 false。
  -le   <=	检测左边的数是否小于等于右边的,如果是,则返回 true。	[ $a -le $b ] 返回 true。
  3.布尔运算符
  !	非运算,表达式为 true 则返回 false,否则返回 true。	[ ! false ] 返回 true。
  -o	或运算,有一个表达式为 true 则返回 true。	[ $a -lt 20 -o $b -gt 100 ] 返回 true。
  -a	与运算,两个表达式都为 true 才返回 true。	[ $a -lt 20 -a $b -gt 100 ] 返回 false。
  4.逻辑运算符
  &&	逻辑的 AND	[[ $a -lt 100 && $b -gt 100 ]] 返回 false
  ||	逻辑的 OR	[[ $a -lt 100 || $b -gt 100 ]] 返回 true
  5.字符串运算符
  =	检测两个字符串是否相等,相等返回 true。	[ $a = $b ] 返回 false。
  !=	检测两个字符串是否相等,不相等返回 true。	[ $a != $b ] 返回 true。
  -z	检测字符串长度是否为0,为0返回 true。	[ -z $a ] 返回 false。
  -n	检测字符串长度是否不为 0,不为 0 返回 true。	[ -n "$a" ] 返回 true。
  $	        检测字符串是否为空,不为空返回 true。	[ $a ] 返回 true。
  6.文件测试运算符
  文件测试运算符用于检测 Unix 文件的各种属性。
  -b file	检测文件是否是块设备文件,如果是,则返回 true。	[ -b $file ] 返回 false。
  -c file	检测文件是否是字符设备文件,如果是,则返回 true。	[ -c $file ] 返回 false。
  -d file	检测文件是否是目录,如果是,则返回 true。	[ -d $file ] 返回 false。
  -f file	检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。	[ -f $file ] 返回 true。
  -g file	检测文件是否设置了 SGID 位,如果是,则返回 true。	[ -g $file ] 返回 false。
  -k file	检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。	[ -k $file ] 返回 false。
  -p file	检测文件是否是有名管道,如果是,则返回 true。	[ -p $file ] 返回 false。
  -u file	检测文件是否设置了 SUID 位,如果是,则返回 true。	[ -u $file ] 返回 false。
  -r file	检测文件是否可读,如果是,则返回 true。	[ -r $file ] 返回 true。
  -w file	检测文件是否可写,如果是,则返回 true。	[ -w $file ] 返回 true。
  -x file	检测文件是否可执行,如果是,则返回 true。	[ -x $file ] 返回 true。
  -s file	检测文件是否为空(文件大小是否大于0),不为空返回 true。	[ -s $file ] 返回 true。
  -e file	检测文件(包括目录)是否存在,如果是,则返回 true。	[ -e $file ] 返回 true。
Shell echo命令
  1.显示普通字符串:
  echo "It is a test"
  2.显示转义字符
  echo "\"It is a test\""
  3.显示变量
  read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量
  #!/bin/sh
  read name 
  echo "$name It is a test"
  4.显示换行
  echo -e "OK! \n" # -e 开启转义
  echo "It is a test"
  5.显示不换行
  #!/bin/sh
  echo -e "OK! \c" # -e 开启转义 \c 不换行
  echo "It is a test"
  6.显示结果定向至文件
  echo "It is a test" > myfile
  7.原样输出字符串,不进行转义或取变量(用单引号)
  echo '$name\"'
  输出结果:
  $name\"
  8.显示命令执行结果
  echo `date`
Shell printf 命令
  printf 命令模仿 C 程序库(library)里的 printf() 程序。
  printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好。
  printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n。
  printf 命令的语法:
  printf  format-string  [arguments...]
  参数说明:
  format-string: 为格式控制字符串
  arguments: 为参数列表。
  %s %c %d %f都是格式替代符
  %-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
  %-4.2f 指格式化为小数,其中.2指保留2位小数。
  #!/bin/bash
  # author:Lrances
  printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg  
  printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234 
  printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543 
  printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876 
  执行脚本,输出结果如下所示:
  姓名     性别   体重kg
  郭靖     男      66.12
  杨过     男      48.65
  郭芙     女      47.99
  printf的转义序列
  序列	说明
  \a	警告字符,通常为ASCII的BEL字符
  \b	后退
  \c	抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略
  \f	换页(formfeed)
  \n	换行
  \r	回车(Carriage return)
  \t	水平制表符
  \v	垂直制表符
  \\	一个字面上的反斜杠字符
  \ddd	表示1到3位数八进制值的字符。仅在格式字符串中有效
  \0ddd	表示1到3位的八进制值字符
Shell 流程控制
  if condition
  then
      command1 
      command2
      ...
      commandN 
  fi
  if condition
  then
      command1 
      command2
      ...
      commandN
  else
      command
  fi
  if condition1
  then
      command1
  elif condition2 
  then 
      command2
  else
      commandN
  fi
  for var in item1 item2 ... itemN
  do
      command1
      command2
      ...
      commandN
  done
  while condition
  do
      command
  done
  无限循环
  无限循环语法格式:

  while :
  do
      command
  done
  或者

  while true
  do
      command
  done
  或者

  for (( ; ; ))
  until 循环
  until 循环执行一系列命令直至条件为 true 时停止。

  until 循环与 while 循环在处理方式上刚好相反。

  一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。

  until 语法格式:

  until condition
  do
      command
  done
  break命令
  break命令允许跳出所有循环(终止执行后面的所有循环)。
  continue
  continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。
  case ... esac
  case ... esac 与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case ... esac 语      句,esac(就是 case 反过来)作为结束标记。
  函数参数
  在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数...
  $#	传递到脚本或函数的参数个数
  $*	以一个单字符串显示所有向脚本传递的参数
  $$	脚本运行的当前进程ID号
  $!	后台运行的最后一个进程的ID号
  $@	与$*相同,但是使用时加引号,并在引号中返回每个参数。
  $-	显示Shell使用的当前选项,与set命令功能相同。
  $?	显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
posted @ 2020-08-17 10:36  Summit20  阅读(167)  评论(0编辑  收藏  举报