BashShell基本脚本构建

1.构建基本脚本(第十一章)

1.简单脚本与显示消息

例1git

#!/bin/bash    #格式规定的第一句话,这行代码的!后代表了脚本要用Bash shell执行
#分开写两行代码,脚本会一次执行
date      #显示当前时间
who      #显示登录帐户
  • 刚写好的脚本不能直接运行,须要赋予执行权限chmod u+x test.sh #赋予脚本执行权限
  • 赋予权限后,在命令行输入:./test.sh # ./的意思是当前目录

例2github

#!/bin/bash    
#echo  "文本"  则文本会在命令行中显示,注意使用双引号能够避免不少麻烦
echo -n "当前时间:"   #使用 -n 命令可使date的结果和当前时间处在同一行
date     
echo  " 在线用户"     # 普通的echo ,在线用户本身独占一行 
who

2.使用变量

  • 在脚本中出现$,就意味着这是个变量,如$val1,反过来要表示美圆的话要加上转义符号 $15 即为15美圆shell

  • 用户能够本身定义变量,但有两点注意:安全

    1. 区分大小写 2. 变量、符号、值之间不能有空格,特别注意
  • 用户变量能够经过美圆符号引用bash

var1=10  #不能有空格
var2=$var1  #用$符号引用
  • 利用$()能够从命令的输出中提取信息,并将其赋值给变量:testing=$(date) #时间信息赋值给了testing
#常见用法,将日期加入文件名
#!/bin/bash
today=$(date +%y%m%d)             #提取时间信息中的年(y)月(m)日(d)
mv  test* test*.$today

3.重定向输入与输出以及管道

  • 输出重定向(大于号>):将命令输出发送到某个文件:date > text #将日期信息保存在text文件中
  • 若不想覆盖文件则使用远大于号>>,date>>text #将日期【添加】到text文件中
  • 输入重定向(小于号<):将文件中的信息输入到命令中
  • 使用内联重定向(远小于号<<)须要指定结束字符,经常使用EOF
var5=$(bc << EOF       #bc,shell的计算器,这段代码计算了var1*var2+var3+var4的值,并取四位小数
scale = 4
a1 = ( $var1 * $var2 )
b1 = ($var3  * $var4 )
a1+b1
EOF
)
  • 管道,命令1的输出做为命令2的输入。两者同时进行
apt -list | sort >apt.list   #将apt包的列表排序并输出到apt.list文件中

4.数学运算

  • 贼麻烦、注意空格
  • expr命令能够进行整数计算(不推荐) ·expr 1 + 5 #空格不能省略
expr 1 * 5  #会报错
expr 1 \* 5 #加上转义符后,正确
  • 使用方括号执行运算会简单不少
#如下两行代码是一个意思
[ 4  *1  ]
expr 4 \* 1
  • 要支持小数点必须使用 bc
#利用管道将echo命令的结果输入到计算器bc中,返回结果
var1=$(echo "scale=4;3.14 / 5" | bc)  #scale能够肯定小数位数但不是四舍五入而是去尾,切记

5.退出码

  • echo $? #查看上一个命令的退出码
  • 退出码与错误有关,正常结束的为0,也能够设定退出码,脚本中加入exit 5退出码即为5
  • 强制终止 CTRL+C

2.if-then 选择结构(第十二章)

1.基本代码 if -then -else

例1:less

#!/bin/bash
#if用法的基本举例
if pwd      #if + 命令   若命令执行(退出码为0,或者说既判为真?),则进行then
then
     echo " It worked"         #输出  It worked,至于pwd的输出,不会显示出来的
fi                #if 语句结束

#另外一个例子
if wrong      #if + 命令   若命令不执行(退出码不为0,或者说既判为否?),则跳过then
then
     echo " It worked"         #输出  It worked,至于pwd的输出,不会显示出来的
fi                #if 语句结束

例2命令行

#!/bin/bash
# if -then -else          命令执行则then,不执行则else
testuser=NoSuchUser
#
if grep $testuser /etc/passwd
then
  echo "The bash files for user $testuser are:"
  ls - /home/$testuser/.b*
  echo           #输出空一行
else
  echo "The user $testuser does not exist on the system"
  echo
fi

例3code

#!/bin/bash
#嵌套的高级用法 elif ,实际上是:else+if
testuser=NoSuchUser
#
if grep $testuser /etc/passwd
then
  echo "The user $testuser exists on the system"

elif ls -d /home/$testuser           #else后面接if,连写的话会很方便
then
  echo "The user $testuser does not exist on the system"
  echo "However ,$testuser has a directory"
fi

2.test命令(比较、判断)

  • if-then语句只能判断退出码。但利用test语句,能够判断真假
  • test语句能够用方括号 [ ] 简写,和计算同样,注意方括号先后要有空格
  • test能够进行数值比较,但只能比较整数
#数值比较功能
#eq 为=  g为greater   l大概为less
[ n1 -eq  n2 ]      #n1=n2
[ n1 -ge  n2 ]      #n1>=n2
[ n1 -gt   n2 ]      #n1>n2
[ n1 -le   n2 ]      #n1<=n2
[ n1 -lt    n2 ]      #n1<n2
[ n1 -ne  n2 ]      #n1!=n2
  • test能够进行字符串比较
#字符串比较功能
#使用大于小于号必定要注意加上转义号,不然会生成文件并断定为真
[ str1 = str2 ]          #比较字符串是否相同
[ str1 !=s tr2 ]        #比较字符串是否不一样
[ str1 \< str2 ]       #字符串1是否比2小,注意转义号
[ str1 \> str2 ]       #字符串1是否比2大,注意转义号
[ -n str1 ]             #字符串长度是否为非0
[ -z str1 ]             #字符串长度是否为0
#test的比较大小和sort的正好反过来,由于test用的是标准ASCII顺序
  • test 能够进行文件比较(最经常使用的)
#能够用来检查系统中的文件,贼好用
[ -d file ]       #检查file是否存在并为一个目录(dir)
[ -e file ]       #检查file是否存(exist)
[ -f file ]        #检查file是否存在并为一个文件(file)
[ -r file ]        #检查file是否存在并可读(read)
[ -s file ]        #检查file是否存在并不是空
[ -w file ]        #检查file是否存在并可写(write)
[ -x file ]         #检查file是否存在并可执行
[  file1 -nt file2 ]  #检查file1是否比file2新(newer then)
[  file1 -ot file2 ]  #检查file1是否比file2旧(older then)
  • 使用双括号能够处理数学表达式,还不懂,不展开
  • 使用双方括号能够处理字符串,还不懂,不展开

3.case命令

  • 使用case能够不停的检查_同一个_变量
#!/bin/bash
#检查用户,对应的用户有不一样的输出
case $USER in    #注意in
rich | barbara)       #注意)
  echo "Welcome, $USER"
  echo "Please enjoy your visit";;   #注意双分号
testing)
  echo "Special testing account";;    #注意双分号
Jessica)
  echo "Do not forget to log off when you're done";;   #注意双分号
*)
  echo Sorry, you are not allowed here";;     #注意双分号
esac     #反写,结束

3.for、while、untill 循环结构(第十三章)

####1.for 命令排序

  • 使用for命令,可使用列表(或变量)中的值
#!/bin/bash
#
for test in "Beijing Nanjing Shanghai Guangzhou Jinan  Xi'an"  #把列表中的值依次赋值给test,又用到了in,另外双引号是个好东西
do 
  echo "The next city is $test"
done     # 结束符号
  • 使用for命令,可使用文件中的值
#!/bin/bash
#
file="cities"  #cities 文件名。文件须要和脚本在同一目录下
#
for test in $( cat $file) #读取文件中的值
do 
  echo "The next city is $test"
done     
#但有时,文件中有空格,如New Shanghai,输出就会当成New 和 Shanghai两个,由于的字段分隔符为空格
  • 字段分隔符 IFS。默认的字段分隔符为:1.空格 2.制表符 3.换行符
  • IFS 是能够在脚本中改变的
IFS=$'\n'             #以换行符为字段分隔符
IFS=$'\n':;"          #以换行符、冒号、分号、双引号为字段分隔符
#
#若是须要屡次改变IFS,把默认的先存起来是个安全的好主意
IFS.OLD=$IFS
  • 可使用通配符如*来遍历目录
  • C语言风格的for命令是处理计数的神器,真好用
#!/bin/bash
#注意双括号和分号
for (( i=1; i <=10 ;i++ ))     #从1开始,每次加1,到10中止
do 
  echo "The nest number is $i"
done
#
#还可使用多个变量哦,用逗号分隔
for (( a=1 , b=10; a <=10 ;a++ ,b-- ))     
do 
  echo " $a  -  $b"  #没作计算,就是输出
done

2.while 循环

  • 当test到否,while就中止循环
#!/bin/bash
#
var1=10
#
while [ $var1 -gt 0 ]   #若var1大于0则继续
do
  echo $var1
  var1=$[ $var1 -1  ]   #计算减一,注意方括号先后的空格
done
  • while容许使用多个test命令(或者其余命令),全部的test都会执行,哪怕那一次有个test没有经过

3.unit 循环

  • 当test到until就中止循环
#!/bin/bash
#
var1=100
#
until [ $var1 -eq 0 ]
do
  echo $var1
  var1=$[ var1 -25 ]
done
  • 与while的区别是一样到0结束,while的最后输出有0,until则不包括0

4.其余

  • 循环能够嵌套,好好使用修改IFS的技术
  • 用break能够退出循环,break是退出当下循环,break 2 是退出外面一层的循环,break 3是退出外面的外面一层的循环
  • 利用continue能够跳过某些循环
#!/bin/bash
#这个脚本最后的输出会跳过var1大于5小于10的部分
for ((var1 =1 ; var1<15 ;var1++ ))
do
  if [ $var1 -gt  5 ]  &&  [  $var -lt 10 ]
  then
      continue
  fi
  echo "The number is $var1"
done
#注意,continue不要和计数部分写在一块儿,会跳过计数形成死循环的
  • 循环的输出,能够在done后面进行处理:done | sort >test.txt 将循环输出排序并保存在test.txt文件中

5.一个小例子

#!/bin/bash
#这个脚本在扫描PATH环境变量下全部有可执行文件的目录,也就是电脑中全部安装的程序
#输出真多……
IFS=:
for folder in $PATH
do
  echo "$folder:"
  for file in $folder/*
  do
      if [ -x $file ]
      then
         echo "    $file"
      fi
   done
done

未完待续,有新想法再写ci

相关文章
相关标签/搜索