1.小试牛刀
1.在终端中显示输出
  $ 表示普通用户
  # 表示管理员用户root
shell脚本通常以#!/bin/bash起始;bash将以#符号开头的行视为注释
脚本执行的两种方式
(1)将脚本名字作为命令行参数
  bash filename.sh
(2)授权脚本执行权限,将其变为可执行文件
 使用chmod命令赋予脚本可执行权限
  chmod a+x filename.sh
  ./filename.sh
echo
echo是用于终端打印的最基本命令。默认情况下,echo在每次调用后会添加一个换行符:
  echo "Hello World"
  echo Hello World
  echo 'Hello World'

双引号允许shell解释字符串中出现的特殊字符。单引号不会对其做任何解释。
如果需要打印像!这样的特殊字符,那就不要放入双引号中,而是使用单引号,或是在特殊字符之前加上一个反斜线(\这里是转义符的意思)
  echo 'Hello World $pwd'
  echo "Hello World \$pwd"

在echo中转义换行符
默认情况下,echo会在输出文本的尾部追加一个换行符。可以使用选项-n来禁止这种行为。echo同样接受双包含转义序列的双引号字符串作为参数。在使用转义序列时,需要使用echo -e"包含转义序列的字符串"
  echo -e "1\t2\t3"

2.使用变量和环境变量
可以使用env或printenv命令查看当前shell中所定义的全部环境变量
PID是相关进程的进程ID,使用pgrep命令就能获取进程ID
  pgrep gedit      #假设gedit是一个应用程序正在运行
变量赋值
  varname=vaule
varname是变量名,value是赋给变量的值。如果value不包含任何空格,那么就不需要将其放入引号中,否则必须使用单引号或双引号
注意:varname = value不同于varname=value。等号两边没有空格的是赋值操作符,加上空格的等号表示的是等量关系测试。
  var="value"
  echo $var      #变量前加上$就可以访问变量的内容

export
export 可新增,修改或删除环境变量,供后续执行的程序使用
PATH变量列出了一些列可供shell搜索特定应用程序目录
如果需要在PATH中添加一条新路径,可以使用如下命令:
  export PATH="$PATH:/home/user/bin"
补充知识点
获取字符串长度
在变量强添加${#variable}
  var=1234567
  echo ${#var}

修改bash的提示字符串
查看设置变量PS1的那一行
  cat ~/.bashrc | grep PS1
  PS1="XXX"
3.使用shell进行数学运算
bash shell使用let、(())、和[]执行基本的算术操作。攻击expr和bc可以用来执行高级操作
let
let命令可以直接执行基本的算术操作。当使用let时,变量名之前不需要在添加$。
  #!/bin/bash
  n1=4
  n2=5
  let result=n1+n2
  echo $result

自加操作
  let n1++
自减操作
  let n1--
[]和()
操作符[]的使用方法和let命令一样:
  result=$[ n1 + n2 ]
在[]中也可以使用$前缀
  result=$[ $n1 + 5 ]
也可以使用(())。出现在(())中的变量名之前需要加上$:
  result=$(( n1 + 50 ))
expr
expr同样也可以用于基本算术操作
  result=`expr 3 + 4`
  result=$(expr $n1 + 5)
注意:以上方法不支持浮点数,只能用于整数运算
bc
bc支持浮点数计算
  echo "4 * 0.56" | bc

设置小数精度:scale
  echo "scale=2;22/7" | bc      #scale=2将小数位个数设为2

进制转换: obase
  #!/bin/bash
  no=100
  echo "obase=2;$no" | bc          
  echo "obase=10;$no" | bc

计算平方以及平方根
  echo "sqrt(100)" | bc
  echo "10^10" | bc
4.文件描述符与重定向
(1)使用大于号将文本保存到文件中
  echo "This is a sample text 1" > temp.txt
(2)使用双大于号将文本追加到文件中
  echo "This is sample text 2" >> temp.txt
注意:>会清空该文件中先前的内容
5.数组与关联数组
(1)可以在单行中使用数组值列表来定义一个数组
  array_var=(test1 test2 test3 test4)
还可以通过索引值来定义数组
  array_var[0]="teset1"
  array_var[1]="teset2"
  array_var[2]="teset3"
  array_var[3]="teset4"
(2)打印特定索引的数组元素内容
  echo ${array_var[0]}
(3)以列表形式打印数组中的所有值
  echo ${array_var[*]}

6.别名
alias命令创建别名
(1).创建别名
  alias new_command='command sequence'
注意alisa命令的效果只是暂时的。一旦关闭当前终端,所有设置过的别名就失效了。
如果需要删除别名,可以使用alias example=,
7.获取并设置日期及延时
(1).读取日期
  date

(2).打印纪元
  date +%s

可以使用纪元的插值来计算一组命令所花的时间
延时
sleep命令可以延迟脚本执行一段时间(以秒为单位)
  sleep 1      #  延时1秒
8.调试脚本
(1).使用选项-x,启用shell脚本的跟踪调试功能。运行带有-x选项的脚本可以打印出所执行的每一行命令以及当前状态。
  bash -x xxx.sh
9.函数和参数
函数和参数
(1).函数的定义
  function fname()
  {
        statmemts;
  }
  或者
  fname()
  {
        statmemts;
  }
(2).只需要使用函数名就可以调用函数,函数参数可以按位置访问,$1是第一个参数,$2是第二个参数...
  fname()
  {
        echo $1, $2;
        echo "$@";
        echo "$*";
        return 0;
  }
知识点补充:
  $0      是脚本名称
  $1      是第一个参数
  $2      是第二个参数
  $n      是第n个参数
  $@      所有参数
  $*      所有参数
  $?      读取上个命令是否执行成功,如果成功返回0。
注意常用$@
导出函数
函数也能像环境变量一样用export导出,如此一来,函数的作用域也可以扩展到子进程中
  export -f fname
10.read
read提供了一种在不需要按下回车键就能读入字符的功能
(1).从输入中读取n个字符并保存
  read -n 2 var            # 输入2个字符不需要按回车就能保存到var中

(2).使用无回显的方式读取密码
  read -s var            # 注意需要回车

(3).使用read显示提示信息
  read -p "Enter Input:" var

(4).用特定的定界符作为输入行的结束
  read -d "!" var
  hello!            # var被设置为hello

11.比较与测试
(1).if
  if condition;then
        commands
  fi
(2).else if
  if [ condition ];then
        commands;
  else if [ condtion ];then
        commands;
  fi
(3).知识点补充
  -eq      等于
  -nq      不等于
  -gt      大于
  -lt      小于
  -ge      大于或等于
  -le      小于或等于
  -a       and
  -o       or
  -f       是否为文件
  -x       是否为可执行文件
  -d       是否为目录
  -e       文件是否存在
  -c       是否为字符设备文件
  -b       是否为块设备文件
  -w       文件是否可写
  -r       文件是否可读
  -z       为空
  -n       不为空
(4).字符串比较
字符串比较时,最好使用双括号。
测试两个字符串是否相同
  [[ $str1 == $str2 ]]
  [[ $str1 != $str2 ]]
(5).测试空串
  [[ -z $str ]]            # 如果str为空则返回真
  [[ -n $str ]]            # 如果str不为空则返回真

                
            
        
浙公网安备 33010602011771号