>涉及到的东西:
>
> * 脚本如何执行与脚本基本书写方式
> * echo、printf终端打印
> * 变量的赋值操作:没有引号、单引号、双引号
> * 变量的取值
> * 两个环境变量:PATH、PS1
> * 数学运算方法:let、(( ))、[ ]、bc
> * 标准输入输出错误 > * 重定向问题:>、<
> * 管道灵活运用
> * tee命令 > * 数组、关联数组 > * 别名:alias > * date > * 调试脚本 > * 函数与参数 > * read > * IFS > * for、while、util循环 > * 如何比较
运行与语句组织
- 文件可运行直接./shell.script(内部转换成了shebang中定义的shell执行器:/bin/bash shell.script)
- 文件不可运行的时候,可以直接使用bash命令执行脚本(这个时候,其实脚本文件内部的shebang定义已经可有可无)
- 脚本组织可以再同一行使用;分割语句,也可以每条语句一行,结尾不加任何分隔符
echo打印与单双无引号的副作用
echo welcome to bash echo 'welcome to bash!' echo "welcome to bash\!" #echo "welcome to bash!" 这个会出错
- 不带引号如果要打印的文本中有分号;的话,会被截断
- 单引号里面,不可使用变量的替换
- 双引号里面,可以使用变量替换,但是要注意保留字符的转义问题
- 可是使用-e参数进行转义字符的显示,可以使用-n来忽略echo结尾的回车
- 使用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
- %s是字符串的打印,%f是浮点数的打印
- -是左对齐,默认为右对齐
- %-4.2f是格式化浮点数,左对齐整数宽度为4个字符,小数保留两位小数
变量基础
- shell变量无需声明无需定义,直接使用赋值,bash中每一个变量的值都是以字符串存储
- 赋值形式:var=value;绝对不能写成var = value或者是var =value因为shell中会把这种认为是逻辑等值判断
- 取值变量,使用**$var或者是${var}**
- 环境变量是一种全局的变量,每个脚本中都可以访问。使用export关键之将一个变量导出成全局变量
- 关键环境变量PATH变量:export PATH="$PATH:/home/user/bin"
- 获取字符串的长度:${#var}
- 获取当前使用的shell:${SHELL}
- 检查是否为超级用户:[ $UID -ne 0 ]
- 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——stdin
- 2——stdout
- 3——stderr
-
tee命令 tee命令接受来自stdin的数据,他将stdout的一份副本写入文件out中,同时将另外一份副本作为后续命令的stdin
cat a* | tee out.txt | cat -n
echo this is a test line > input.txt exec 3<input.txt #使用文件描述符3打开并读取文件 cat <$3 #使用文件描述符3,使用之后不可以再次使用,如要再次使用要再一次使用exec进行读取
使用数组
>这里使用数组有两种,一种是普通的数组,一种是关联数组,不过关联数组只能再Bash4.0版本才被引入,我发现自己mac的shell不支持,所以这里先不介绍
- 普通数组
array_var=(1,2,3,4,5,6) #数组的定义 echo ${array_var[0]} #数组的读取 array_var[0]=123 #数组的单个赋值 echo ${array_var[*]} #打印数组所有的值 echo $[#array_var[*]] #打印数组的长度
- 关联数组 暂不介绍
创建别名
alias install='sudo apt-get install' alias rm='cp $@ ~/backup && rm $@'
日期格式的介绍
- date可以直接打印当前时间
- 格式化固有的日期:
date --date "Thu Nov 18 08:07:21 IST 2010" +%s
- 设置当前的日期时间:
date -s "21 June 2009 11:01:22"
- 日期格式化:
- 所有日期为零的,指的是:1970年1月1日0时0分0秒
- 格式化之前加上
+
- 基本能用上的格式化字母表:
- %Y 年份
- %m 月份
- %d 日期
- %H 小时
- %M 分钟
- %S 秒
- %N 纳秒
- %s Unix纪元时
函数
- 基本定义与使用:
function fname() { statements; } fname ; fname arg1 arg2
-
- $1 第1个参数
- $2 第2个参数
- $n 第n个参数
- $@ 扩展成"$1" "$2" "$3"
- $* 扩展成"$1c$2c$3",其中c是IFS的第一个字符
分隔符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
-
for循环基本使用方式
for var int list
-
for循环也可以使用c语言的方式:
for((i=0;i<10;i++))
- 这种方式必须要在bash里面才能有效,ubuntu默认使用的阉割版的bash——dash就不行
-
while循环的基本使用方式:
while condition do commands; done
比较相关
-
基本使用模式
[ condition ]
,中括号内侧两边必须要有空格,否则会报错例如[$var -eq 0 ] or [ $var -eq 0]
-
逻辑运算符的巧用
condition && action #如果condition为真的话执行action condition || action #如果condition为假的话执行action
-
算术比较
- -gt:大于
- -le:小于
- -eq:等于
- -ge:大于等于
- -le:小于等于
- -a:逻辑与:
[ $var1 -ne 0 -a $var2 -gt 2 ]
- -o:逻辑或:
[ $var1 -ne 0 -o var2 -gt 2 ]
-
文件比较
-
字符串比较
- [[ $str1 > $str2 ]]
- [[ $str1 < $str2 ]]
- [[ -z $str1 ]]:如果str1包含的是空字符串,则返回的是真,这里面的空代表的是未定义或者是nil
- [[ -n $str1 ]]:如果str1包含的是非空字符串,则返回的是真