shell脚本深入学习或是再次学习-旅途中开始的学习

>涉及到的东西:
>
> * 脚本如何执行与脚本基本书写方式
> * echo、printf终端打印
> * 变量的赋值操作:没有引号、单引号、双引号
> * 变量的取值
> * 两个环境变量:PATH、PS1
> * 数学运算方法:let、(( ))、[ ]、bc
> * 标准输入输出错误 > * 重定向问题:>、<
> * 管道灵活运用
> * tee命令 > * 数组、关联数组 > * 别名:alias > * date > * 调试脚本 > * 函数与参数 > * read > * IFS > * for、while、util循环 > * 如何比较

运行与语句组织

  1. 文件可运行直接./shell.script(内部转换成了shebang中定义的shell执行器:/bin/bash shell.script)
  2. 文件不可运行的时候,可以直接使用bash命令执行脚本(这个时候,其实脚本文件内部的shebang定义已经可有可无)
  3. 脚本组织可以再同一行使用;分割语句,也可以每条语句一行,结尾不加任何分隔符

echo打印与单双无引号的副作用

echo welcome to bash
echo 'welcome to bash!'
echo "welcome to bash\!"
#echo "welcome to bash!" 这个会出错
  1. 不带引号如果要打印的文本中有分号;的话,会被截断
  2. 单引号里面,不可使用变量的替换
  3. 双引号里面,可以使用变量替换,但是要注意保留字符的转义问题
  4. 可是使用-e参数进行转义字符的显示,可以使用-n来忽略echo结尾的回车
  5. 使用pgrep可以查询正在运行程序的PID
echo -n "jicheng"
echo -e "1\t2\t3"

prinf打印

#!/bin/bash 
#文件名:printf.sh
printf  "%-5s %-10s %-4s\n" No Name  Mark
printf  "%-5s %-10s %-4.2f\n" 1 Sarath 80.3456
printf  "%-5s %-10s %-4.2f\n" 2 James 90.9989
printf  "%-5s %-10s %-4.2f\n" 3 Jeff 77.564
  1. %s是字符串的打印,%f是浮点数的打印
  2. -是左对齐,默认为右对齐
  3. %-4.2f是格式化浮点数,左对齐整数宽度为4个字符,小数保留两位小数

变量基础

  1. shell变量无需声明无需定义,直接使用赋值,bash中每一个变量的值都是以字符串存储
  2. 赋值形式:var=value;绝对不能写成var = value或者是var =value因为shell中会把这种认为是逻辑等值判断
  3. 取值变量,使用**$var或者是${var}**
  4. 环境变量是一种全局的变量,每个脚本中都可以访问。使用export关键之将一个变量导出成全局变量
  5. 关键环境变量PATH变量:export PATH="$PATH:/home/user/bin"
  6. 获取字符串的长度:${#var}
  7. 获取当前使用的shell:${SHELL}
  8. 检查是否为超级用户:[ $UID -ne 0 ]
  9. PS1环境变量:\w:当前工作目录(大写为相对路径); \h:主机名; \u:用户名

使用函数添加环境变量

prepend() { [ -d "$2" ] && eval $1=\"$2\$\{$1:+':'\$$1\}\" && export $1 ; }
prepend PATH /opt/myapp/bin
prepend LD_LIBRARY_PATH /opt/myapp/lib

>p.s.:一个扩展形式:${parameter:+expressiong}如果parameter有值不为空,则使用expressiong的值

数学运算

  • 普通整数计算
result='345'
#第一种使用let
let result++
let result+=8

#第二种使用[ ]
result=[ $result+5 ]

#第三种使用(( ))
result=$(( result+3 ))

#第四种使用expr
result=`expr 3+6`
result=$(expr $result+4)
  • 浮点数计算
#(1)基本运算
echo "4 * 0.56" | bc
#结果:2.24
no=54;
result=`echo "$no * 1.5" | bc`
echo $result
#结果:81.0

#(2)设置小数精度
echo "scale=2;3/8" | bc
#结果:0.37

#(3)计算平方根
echo "sqrt(100)" | bc #Square root
echo "10^10" | bc #Square

#(4)进制转换
#!/bin/bash
no=100
echo "obase=2;$no" | bc
#结果:1100100
no=1100100
echo "obase=10;ibase=2;$no" | bc
#结果:100

重定向

  1. 三种重定向

    • 1——stdin
    • 2——stdout
    • 3——stderr
  2. 两种重定向方法

  3. tee命令 tee命令接受来自stdin的数据,他将stdout的一份副本写入文件out中,同时将另外一份副本作为后续命令的stdin

cat a* | tee out.txt | cat -n
  1. 自定义文件描述符
echo this is a test line > input.txt
exec 3<input.txt #使用文件描述符3打开并读取文件
cat <$3 #使用文件描述符3,使用之后不可以再次使用,如要再次使用要再一次使用exec进行读取

使用数组

>这里使用数组有两种,一种是普通的数组,一种是关联数组,不过关联数组只能再Bash4.0版本才被引入,我发现自己mac的shell不支持,所以这里先不介绍

  1. 普通数组
array_var=(1,2,3,4,5,6) #数组的定义
echo ${array_var[0]} #数组的读取
array_var[0]=123 #数组的单个赋值
echo ${array_var[*]} #打印数组所有的值
echo $[#array_var[*]] #打印数组的长度
  1. 关联数组 暂不介绍

创建别名

alias install='sudo apt-get install'
alias rm='cp $@ ~/backup && rm $@'

日期格式的介绍

  1. date可以直接打印当前时间
  2. 格式化固有的日期:date --date "Thu Nov 18 08:07:21 IST 2010" +%s
  3. 设置当前的日期时间:date -s "21 June 2009 11:01:22"
  4. 日期格式化:
    • 所有日期为零的,指的是:1970年1月1日0时0分0秒
    • 格式化之前加上+
    • 基本能用上的格式化字母表:
      • %Y 年份
      • %m 月份
      • %d 日期
      • %H 小时
      • %M 分钟
      • %S 秒
      • %N 纳秒
      • %s Unix纪元时

函数

  1. 基本定义与使用:
function fname()
{
   statements;
}

fname ;
fname arg1 arg2
  1. 函数内部取参数方法(同样也是shell取入参的方法

    • $1 第1个参数
    • $2 第2个参数
    • $n 第n个参数
    • $@ 扩展成"$1" "$2" "$3"
    • $* 扩展成"$1c$2c$3",其中c是IFS的第一个字符
  2. 使用export将函数导出,这样就能在子进程中使用函数

  3. 使用$?来获取刚刚执行完的函数(命令)的返回值是什么,0是正常退出

分隔符IFS(Internal Field Separator)

> 这个东西是shell脚本里面一个重要概念,再处理文本数据时候,单个数据流划分为不同的数据元素的定界符(dlimiter),默认IFS是回车

#!/bin/bash
#展示IFS的用法
line="root:x:0:0:root:/root:/bin/bash" 
oldIFS=$IFS;
IFS=":"
count=0
for item in $line;
do                 
    [ $count -eq 0 ]  && user=$item;
    [ $count -eq 6 ]  && shell=$item;
    let count++
done;
IFS=$oldIFS
echo $user\'s shell is $shell;

循环的使用for与while

  1. for循环基本使用方式for var int list

  2. {1..10}可以生成1到10的列表,{a..z}可以生成a到z的列表

  3. for循环也可以使用c语言的方式:for((i=0;i&lt;10;i++))

    • 这种方式必须要在bash里面才能有效,ubuntu默认使用的阉割版的bash——dash就不行
  4. while循环的基本使用方式:

while condition
do
    commands;
done

比较相关

  1. 基本使用模式[ condition ],中括号内侧两边必须要有空格,否则会报错例如[$var -eq 0 ] or [ $var -eq 0]

  2. 逻辑运算符的巧用

condition && action #如果condition为真的话执行action
condition || action #如果condition为假的话执行action
  1. 算术比较

    • -gt:大于
    • -le:小于
    • -eq:等于
    • -ge:大于等于
    • -le:小于等于
    • -a:逻辑与:[ $var1 -ne 0 -a $var2 -gt 2 ]
    • -o:逻辑或:[ $var1 -ne 0 -o var2 -gt 2 ]
  2. 文件比较

    • -f:如果给定的变量包含正产的文件路径或者文件名,则返回为真
    • -x:如果给定的变量包含的文件可执行,则返回为真
    • -d:如果给定的变量包含的是目录,则返回为真
    • -e:如果给定的变量包含的文件存在,则返回为真
    • -c:如果给定的变量是一个字符设备文件的路径,则返回为真
    • -b:如果给定的变量是一个块设备文件的路径,则返回为真
    • -w:如果给定的变量包含的文件可写,则返回为真
    • -r:如果给定的变量包含的文件可读,则返回为真
    • -L:如果给定的变量包含一个符号链接,则返回真
  3. 字符串比较

    • [[ $str1 > $str2 ]]
    • [[ $str1 < $str2 ]]
    • [[ -z $str1 ]]:如果str1包含的是空字符串,则返回的是真,这里面的空代表的是未定义或者是nil
    • [[ -n $str1 ]]:如果str1包含的是非空字符串,则返回的是真

相关文章

普通模式 >G 增加当前行到文档末尾处的缩紧层级 $ 移动到本行的末尾 . 相当于一个...
原文连接: https://spacevim.org/cn/layers/lang/elixir/ 模块简介 功能特性 启用模块 快捷键 语言专属...
原文连接: https://spacevim.org/cn/layers/lang/dart/ 模块简介 功能特性 依赖安装及启用模块 启用模...
 =   赋值操作符,可以用于算术和字符串赋值 +        加法计算     -        减法运算...
1.根据包名来查看指定的APP指定数据 adb shell "top | grep com.xxx.xxx" 由于这样打印出来的数...
ctrl+F 向下翻页 ctrl+B 向下翻页 u 取消最近一次操作 U 取消当前行的操作 ZZ 保存当前内容并退出 gg 跳...