LInuxDay8——shell脚本编程基础

变量

变量即命名的内存空间

在shell中所有变量默认都当成字符型变量,bash不支持浮点型变量

变量的命名规则:

  不能使程序中的保留字:例如if, for

  只能使用数字、字母及下划线,且不能以数字开头

  见名知义

  统一命名规则:驼峰命名法

按变量的生效范围可分为:

 局部变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效

 环境(全局)变量:生效范围为当前shell进程及其子进程

 本地变量:生效范围为当前shell进程中某代码片断,通常指函数

 位置变量:$1, $2, ...来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数

 特殊变量:$?, $0, $*, $@, $#,$$

局部变量:

变量赋值:VAR=‘value’

  字符串:Name=“root”

  变量引用:Name=“$USER”

  命令引用:Name=·whoami·

变量引用:${VAR}

  "":弱引用,其中的变量引用会被替换为变量值

  '':强引用,其中的变量引用不会被替换为变量值,而保持原字符串

set 显示已定义的所有变量

unset VAR删除已定义的变量

局部变量只在当前bash生效

环境变量:

变量声明:

  export name=VALUE

  declare -x name=VALUE

显示环境变量的命令:

  env

  printenv

  export

  declare -x

bash内置的环境变量

  PATH

  SHELL

  USER

  UID

  HOME

  PWD

  SHLVL 是记录多个 Bash 进程实例嵌套深度的累加器

  LANG

  MAIL

  HOSTNAME

  HISTSIZE

  - 上一个命令执行后的最后一个参数

只读变量(常量)

声明:

  readonly VAR

  declare -r VAR

readonly -p 查看只读变量

位置变量

  $1,$2...:对应脚本参数位置

   shift:踢出前一个位置变量

  $#:脚本参数的个数

  $0:表示脚本的绝对路径,如果是符号链接则表示符号链接的绝对路径

  $*:传递给脚本的所有参数,全部参数合为一个字符串

  $@:传递给脚本的所有参数,每个参数为独立字符串

  $@ $* 只在被双引号包起来的时候才会有差异

  set -- 清空所有位置变量

退出状态

$?:脚本或命令的退出状态,0为成功,非0(1-255)为失败

exit [#]:自定义退出状态码,并退出当前bash进程

如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码

算术运算

运算符:

  +

  -

  *

  /

  %:取模

  **:乘方

  ^:异或

    • 复制代码
      [root@centos6 ~]# a=3
      [root@centos6 ~]# b=5
      [root@centos6 ~]# echo $a $b
      3 5
      [root@centos6 ~]# a=$[a^b];b=$[a^b];a=$[a^b] #a和b的值互换
      [root@centos6 ~]# echo $a $b
      5 3
      复制代码

算术运算表示法:

  let VAR=算术表达式

  VAR=$[算术表达式]

  VAR=$((算术表达式))

  VAR=$(expr 算术表达式,但是运算符中间需要有空格)

  echo '算术表达式' |bc

$RANDOM:bash内置随机数生成器(0-32767)

条件测试

逻辑运算

0,true

1,false

与:

1 与 1 = 1
1 与 0 = 0
0 与 1 = 0
0 与 0 = 0

或:

1 或 1 = 1
1 或 0 = 1
0 或 1 = 1
0 或 0 = 0

非:

! 1 = 0
! 0 = 1

条件测试(test)

  test EXPRESSION

  [ EXPRESSION ]

  [[ EXPRESSION ]]

  EXPRESSION前后必须有空白字符

条件测试,为真则返回0,为假则返回1

命令间的逻辑关系

CMD1  &&  CMD2:逻辑与,如果CMD1返回为真,则CMD2执行;否则CMD2不执行

CMD1  ||  CMD2:逻辑或,如果CMD1返回为假,则CMD2执行,否则CMD2不执行

  CMD1  ||  { CMD2;CMD3; }:如果CMD1返回为假,则执行CMD2和CMD3

测试符:

变量测试:

  -v:变量是否设置

数值测试

  -eq:等于

  -ne:不等于

  -lt:小于

  -le:小于等于

  -gt:大于

  -ge:大于等于

字符串测试

  ==:相等

  >:大于,比较ASCII码

  <:小于,比较ASCII码

  !=:不等

  =~:左侧字符串是否能够被右侧的PATTERN所匹配,用[[ STRING =~ PATTERN ]],PATTERN必须为扩展的正则表达式

hostping.sh

  -z:是否为空

  -n:是否为不空

文件测试

  -a == -e:是否存在

  -b:是否为块设备

  -c:是否为字符设备

  -d:是否为目录

  -f:是否为普通文件

  -h == -L:是否为符号链接

  -p:是否为管道文件

  -S:是否为套接字文件

  -r:是否可读

  -w:是否可写

  -x:是否可执行

  -u:是否有SUID权限

  -g:是否有SGID权限

  -k:是否有sticky权限

  -s:是否是非空文件

  -t fd:文件描述符是否在打开状态

  -N:文件自从上一次被读取之后是否被修改过

  -O:当前有效用户是否为文件属主

  -G:当前有效用户是否为文件属组

文件属性双目测试

  FILE1 -ef FILE2:FILE1是否是FILE2的硬链接

  FILE1 -nt FILE2:FILE1是否新于FILE2(mtime)

  FILE1 -ot FILE2:FILE1是否旧于FILE2

组合条件测试

组合测试条件

  -a:与关系(并且)

  -o:或关系(或者)

  ! :非关系

摩根定律:

  !(A -o B) = !A -a !B

  !(A -a B) = !A -o !B

read命令

使用read来把输入值分配给一个或多个shell变量,

read 从标准输入中读取值,给每个单词分配一个变量

所有剩余单词都被分配给最后一个变量

选项:

  -p:输入提示信息

  -s:静默输入,用于输入密码时

  -n #:限定输入字符串的长度

  -d 'EOF':当匹配到结束符时自动结束

  -t #:超时时间

复制代码
#!/bin/bash
#

read -t 5 -p "please input head number: " HEADNU
read -t 5 -p "please input feet number: " FEETNU

echo -e "chook number is $((($FEETNU-2*$HEADNU/2)))\n$(($HEADNU-$((($FEETNU-2*$HEADNU/2)))))"
复制代码
原文地址:https://www.cnblogs.com/Gmiaomiao/p/8782755.html