shell脚本编程笔记大全

1,292 阅读4分钟

1.shell脚本编程基础

创建shell脚本文件时,必须在文件开头指定要使用的shell解释器;常见的为bash,本文实践用Mac自带的zsh解释器。在文件开头添加:#!/bin/zsh

#!/bin/zsh
#desc:the first script
#name:first.sh
date
echo 'welcome to the shell world'
--------------------------
进入到脚本目录,运行 ./first.sh     #也可以zsh first.sh或者source first.sh
zsh: permission denied: ./test1.sh   
没有执行权限,添加权限即可
chmod  u+x ./test1.sh
--------------输出
2019年 8月 9日 星期五 10时47分32秒 CST
welcome to the shell world

1.使用环境变量

shell维护着一组环境变量,用来记录特定到系统信息,用set命令可以查看当前环境变量列表 在shell脚本中,可以在环境变量名称前面添加$符号来使用它。

#!/bin/zsh
# the second test
echo -n time: #echo后面加上-n可以将字符串和命令输出显示在同一行
date
echo uid:$UID
echo home:$HOME
echo user:$USER
days=5
guest="Jessica"
echo $guest checked in $days days ago
------------------------------------out
time:2019年 8月 9日 星期五 11时07分06秒 CST
uid:501
home:/Users/selfeasy.zhang
user:selfeasy.zhang
Jessica checked in 5 days ago
---------------
使用read only命令可以将变量定义为只读变量,不可修改。

2.命令替换

shell脚本中最有用的特性之一就是可以从命令输出中提取信息,并将其赋给变量。 命令输出赋值变量到两种方式:反引号符`和$()格式

#!/bin/zsh
# the third test
c=`date`
a=$(date)
echo $c
echo $a
--------------------------------out
2019年 8月 9日 星期五 11时15分39秒 CST
2019年 8月 9日 星期五 11时15分39秒 CST

3.数学运算

#!/bin/zsh
# the third test
#⚠️数学操作符两边空格
a=4
b=5
c=$(expr $a + $b) #1.使用expr进行数学计算
echo $c

d=$[$a + $b] #2.使用$[operation]进行数学计算
echo $d

e=$(echo "scale=4;$a / $b"|bc) #3.执行浮点数运算,使用bc命令,scale表示保留到小数点位
echo $e
----------out
9
9
.8000

4.结构化

#!/bin/zsh
if noy;then
echo `date`
elif pwd;then
    echo 'date'
else
   echo '123'
fi
----------out
./1.sh:2: command not found: noy  #如何避免错误输出
/Users/selfeasy.zhang/Desktop/shell_test
2019年 8月 9日 星期五 11时55分27秒 CST
if [ 1 -eq 2 ];then    #⚠️空格
echo 'date1'
elif pwd;then
    echo `date`
else
   echo '123'
fi
-----------------out
/Users/selfeasy.zhang/Desktop/shell_test
2019年 8月 9日 星期五 12时00分35秒 CST

可在if-then中使用等高级特性

((expression))提供高级数学表达式,expreission可以是任意等赋值或比较表达式; [[expression]]提供字符串比较

case $USER in 
   selfeasy.zhang|self)
      echo $USER
      ;;
    axs)
      echo 111
      ;;
    *)
      echo "ddd"
      ;;
esac
---------------------out
selfeasy.zhang
#!/bin/zsh
for ic in 1 3 4
do
   echo $ic
done
-----------out
1
3
4
------------
#shell会将空格、制表符、换行符作为数据等分隔符,可以通过IFS来限定分隔符。
#!/bin/zsh
IFS=$'\n'
a='1 3 4'
for ic in $a
do
   echo $ic
done

for ((a=0;a<10;a++))
do 
   echo $a
done>1.txt
---------out
1 3 4
第二个循环会将数据输出到1.txt文件

除了以上结构化命令,还有while、until命令。break和continue命令表示跳出循环。 break n表示跳出外部循环,默认break表示跳出内部循环

#!/bin/zsh
in='1.txt'
while IFS=$'\n' read -r i #若分割得到多个值,则i变为i j k
do 
  echo $i
done<"$in"
#while循环按行读取文件,并并以换行符分割,然后输出

5.特殊参数变量

$#:表示命令行运行脚本时携带的参数个数
$*:将命令行提供的参数当作一个单词保存,是一个整体
$@:将命令行中的参当作一个字符串中多个独立的单词,能够循环遍历
?:当前进程PID
$!:上一条运行后台进程到PID
shift:向左移动变量
1>file:将正常输出重定向到file;
2>file:将错误输出重定向到file;
&>:将错误和正常输出重定向到file;
$?:上一条命令执行状态值,成功则为0,状态值为0-255
${#var} :echo ${#var}获取长度

6.常见到shell脚本

  1. 查看mysql库
$(mysql -uroot -p'passwd' -e "show databases;"|egrep -v 'Database|^test|mysql|performance_schema|information_schema')

2.高级shell脚本编程

1.函数

#!/bin/zsh
#using the function in the script

function fun1()
{
       echo 'this is an example of a function'
}
count=1
while [ $count -le 5 ]
do 
    fun1
    count=$[$count+1]
done
--------------向函数传参时,放在同一行,如:fun1 va1 val2

2.sed

sed工具:流编辑器,在文本编辑器处理数据之前基于预先提供的规则来编辑数据流

#s命令会用斜线间指定的第二个文本字符串来替换第一个文本字符串模式,只替换第一个匹配的。它的修改不影响原始数据,只是将修改后的数据输出到stdout
#s/pattern/replacement/flags
#ns/pattern/replacement/flags  加入寻址模式n,操作第n行数据
flags:g 表明新文本将会替换所有匹配的文本
      p 表明原先行的内容要打印出来
      w file 将替换的结果写到文件中 
sed 'd' 删除流中所有文本行
echo 'ddad  adad' | sed 's/d/self/'          out:selfdad  adad
#-e命令执行多个替换命令
echo 'dsas' | sed -e 's/d/self/;s/a/jj/'     out:selfsjjs
#-f命令从文件中读取编辑器命令
sed -f sedfile
sedfile内容:
-------
s/d/self/
s/a/jj/
------

3.gawk

gawk比sed更高级,可以提供一个类编程环境来修改和重新组成文件中的数据。有些系统不支持gawk,可以用awk.。 awk -F fs :指定划分数据字段的分隔符,默认的分隔符是任意的空白符

awk '{print "dsd"}'    out:dsd
gawk的主要特性之一是其处理文本文件中数据的能力。它会自动给一行中的每个数据元素分 配一个变量。默认情况下,gawk会将如下变量分配给它在文本行中发现的数据字段: 
$0:代表整个文本行
$1:代表文本行中的第一个数据字段
echo "My name is Rich" | awk '{$4="Christine"; print $0}' 
out:My name is Christine    #执行多个命令,以;间隔

shell脚本编程笔记大全