linux基础知识5-Shell编程基础

视频链接
http://www.imooc.com/learn/336

1. Bash变量
1.1 变量分类
   # 用户自定义变量
     只在当前Shell中生效(局部变量)
   # 环境变量
     在当前Shell和这个Shell的所有子Shell中生效(全局变量, 可用pstree | grep bash 命令查看进程树中的子Shell关系)
     这种变量中主要保存的是和系统操作环境相关的数据。
     变量可以自定义,但是对系统生效的环境变量名和变量作用是固定的。
   # 位置参数变量
     这种变量主要是用来向脚本中传递参数或数据的,变量名不能自定义,变量作用也是固定的。
   # 预定义变量
     是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。
1.2 用户自定义变量
   # 定义变量('='左右两边没有空格, 变量值中如果有空格, 需要用双引号将变量值引起来)
   变量名=变量值
   示例: 
     name=123
     name="123 abc"
   
   # 调用变量
   echo $变量名
   示例:
     echo $name
   
   # 叠加变量
   x="$x"456
   x=${x}456
   
   # 查看变量(查看系统中已生效的所有变量)
   set 
   set -u  # -u 参数表示后续调用未声明的变量时会报错(bash: a: unbound variable), 默认无任何提示
   
   # 删除变量
   unset 变量名
   示例:
     unset name
1.3 环境变量
   # 设置环境变量
   export 变量名=变量值
   示例:
     x=123        # 设置一个用户自定义变量(局部变量)
     export y=abc # 设置一个环境变量(全局变量)
     bash         # 进入子Shell中
     echo $x      # 这里看不到父Shell中的变量x
     echo $y      # 这里可以看到父Shell中的变量y
   
   # 调用环境变量 echo $x
   # 叠加环境变量 x="$x"abc
   # 查看环境变量
   set            # 查看所有变量
   env            # 查看环境变量
   
   # 常用环境变量
   echo $HOSTNAME # 主机名
   echo $SHELL    # 当前Shell
   echo $HISTSIZE # 历史命令条数
   echo $USER     # 当前用户
   echo $HOME     # 当前用户的家目录
   echo $LANG     # 当前语系信息
   echo $PATH     # 系统查找命令的路径
   echo $PS1      # 命令提示符设置
   
   # PS1环境变量
   \d 显示日期, 格式为"星期 月 日"
   \t 显示24小时制时间, 格式为"HH:MM:SS"
   \A 显示24小时制时间, 格式为"HH:MM"
   \u 显示当前用户名
   \w 显示当前所在目录的完整名称
   \W 显示当前所在目录的最后一个目录
   \$ 提示符, 如果是root用户, 会显示为'#', 如果是普通用户, 会显示为'$'(不同系统会有所不同)
   \H 显示完整的主机名
   示例:
     PS1="[\u@\H \t \w]\$ "              # 显示为[root@my-suse 23:25:38 /home]$ 
     PS1="[\e[1;32m\u\e[0m@\H \t \w]\$ " # \e[1; 是设置颜色的起始标识, 32m 表示绿色, \e[0m 是设置颜色的结束标志
   
   # 查询当前系统语系 locale 
   LANG                # 定义系统主语系的变量
   LC_ALL              # 定义整体语系的变量
   locale -a | more    # 查看系统支持的所有语系
   /etc/sysconfig/i18n # 系统默认语系的配置文件
1.4 位置参数变量
   $n # $0 代表命令本身, $1~$9代表第一到第九个参数, 十以上的参数需要用大括号包含, 如${10}
   $* # 这个变量代表命令行中所有参数, $*把所有参数看成一个整体
   $@ # 这个变量也代表命令行中所有参数, 不过$@把每个参数区分对待
   $# # 这个变量代表命令行中所有参数的个数
   示例1:
   my_suse:~ # vi hello.sh
   ---------- 文件内容如下 ------------
   #!/bin/bash
   num1=$1
   num2=$2
   sum=$(($num1 + $num2))
   echo "$1 + $2 = $sum"
   ------------------------------------ 
   my_suse:~ # ./hello.sh 12 13
   # 这里$((...))表示数值运算, 默认$a+$b是表示字符串拼接操作
   示例2:
   my_suse:~ # vi for.sh
   ---------- 文件内容如下 ------------
   #!/bin/bash
   for i in "$*"
   do 
     echo "The params is $i"
   done
   for y in "$@"
   do 
     echo "The param is $y"
   done 
   ------------------------------------ 
   my_suse:~ # ./for.sh 1 2 3 4 5
1.5 预定义变量
   $? 最后一次所执行命令的返回状态, 0表示上一个命令执行成功, 非0表示上一个命令执行失败
   $$ 当前进程的的进程号(PID)
   $! 后台运行的最后一个进程的进程号(PID)
   
   # 接收键盘输入
   read [选项] [变量名]
   -p "提示信息"  # 在等待read输入时, 显示的提示信息
   -t 秒数        # read命令默认会一直等待用户输入, 使用此选项可以指定等待时间
   -n 字符数      # read命令只接受指定的字符数, 就会执行
   -s             # 隐藏输入的数据, 适用于机密信息的输入
   示例:
   my_suse:~ # vi read.sh
   ---------- 文件内容如下 ------------
   #!/bin/bash
   read -p "Please input your name: " name
   echo "name = $name"
   read -p "Please input your age: " -t 30 age
   echo "age = $age"
   read -p "Please input your passwd: " -s passwd
   echo -e "\npasswd = **$passwd**"
   read -p "Please input your sex [M/F]: " -n 1 sex
   echo -e "\nsex = **$sex**"
   ------------------------------------ 
   my_suse:~ # ./read.sh
   
2. 条件判断
2.1 文件判断
   -b 文件         # 该文件是否存在, 并且是否为块设备文件
   -c 文件         # 该文件是否存在, 并且是否为字符设备文件
   -d 文件         # 该文件是否存在, 并且是否为目录
   -e 文件         # 该文件是否存在
   -f 文件         # 该文件是否存在, 并且是否为普通文件
   -L 文件         # 该文件是否存在, 并且是否为符号链接文件
   -p 文件         # 该文件是否存在, 并且是否为管道文件
   -s 文件         # 该文件是否存在, 并且是否为非空
   -S 文件         # 该文件是否存在, 并且是否为套接字文件
2.2 文件权限判断
   -r 文件         # 该文件是否存在, 并且是否有读权限
   -w 文件         # 该文件是否存在, 并且是否有写权限
   -x 文件         # 该文件是否存在, 并且是否有执行权限
   -u 文件         # 该文件是否存在, 并且是否有SUID权限
   -g 文件         # 该文件是否存在, 并且是否有SGID权限
   -k 文件         # 该文件是否存在, 并且是否有SBit权限
2.3 两个文件比较
   文件1 -nt 文件2 # 文件1的修改时间 是否比 文件2的修改时间 新
   文件1 -ot 文件2 # 文件1的修改时间 是否比 文件2的修改时间 旧
   文件1 -ef 文件2 # 文件1的索引号   是否和 文件2的索引号   一致, 用于判断硬链接
2.4 整数比较
   整数1 -eq 整数2 # 整数1 是否等于     整数2
   整数1 -ne 整数2 # 整数1 是否不等于   整数2
   整数1 -gt 整数2 # 整数1 是否大于     整数2
   整数1 -lt 整数2 # 整数1 是否小于     整数2
   整数1 -ge 整数2 # 整数1 是否大于等于 整数2
   整数1 -le 整数2 # 整数1 是否小于等于 整数2
2.5 字符串比较
   -z 字符串          # 字符串 是否为 空
   -n 字符串          # 字符串 是否为 非空
   字符串1 == 字符串2 # 字符串1 是否等于   字符串2
   字符串1 != 字符串2 # 字符串1 是否不等于 字符串2
2.6 逻辑判断
   判断1 -a 判断2     # 逻辑与, 两个都为true, 结果才为true
   判断1 -o 判断2     # 逻辑或, 有一个为true, 结果就为true
   !判断              # 逻辑非
   
########################################################
# 通过 while 循环读取文件内容
#!/bin/bash
# 
while read line 
do
  userName=$(echo $line | cut -d':' -s -f1)
  userId=$(echo $line | cut -d':' -s -f3)
  if [ $userId -gt 500 ]; then
    echo "userName=$userName, userId=$userId"
  fi
done < /etc/passwd
# end


# 相关链接

https://code.csdn.net/snippets/623740/master/linux-常用命令/raw

-- END

你可能感兴趣的:(linux基础知识5-Shell编程基础)