jinhucheung / blog

学习笔记

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Linux 学习之Shell Script

jinhucheung opened this issue · comments

commented

1. Script的执行方式

Script执行方式分为直接执行和source执行

1.1 直接执行

其中直接执行,是启动子进程执行Script,父进程休眠,Script中的操作不影响父进程.

可以分为路径执行,PATH执行与sh执行(sh是/bin/bash的硬连接)

这里说下sh执行,sh可以调试script
使用参数-n 不执行script,仅检查语法
使用参数-x 调试模式,显示执行时的script(变量都被准确赋值)

1.2 source执行

父进程中执行,操作会影响父进程

commented

2. Shell中的数值运算

我们除了可以使用 declare来定义数值型变量外,也可以直接使用$((运算式))来进执行数值处理,比如

x="10"
y="4"
echo $(($x%$y))
commented

3. test与判断式

3.1 test

我们可以使用test来查看文件是否存在及其属性,也可进行数值比较与字符串比较(这两个也可以在判断式中比较)
以下是test的一部分参数表

参数 代表意义
判断文件存在与类型 格式 test -e filename
-e 该文件是否存在
-f 该文件是否存在且为文件
-d 该文件是否存在且为目录
-b 该文件是否存在为块设备
判断文件权限 格式 test -r filename
-r 该文件是否可读
-w 该文件是否可写
-x 该文件是否可执行
-u 是否具有SUID
-g 是否具有SGID
-k 是否具有SBIT
比较两数值 test n1 -eq n2
-eq ==
-ne !=
-gt >(greater than)
-lt <
-ge >=
-le <=
判断字符串数据
test str1=str2 相等
test str1!=str2 不相等
多重条件判定 逻辑操作
-a AND : test -e file1 -a test -e file2
-o OR
! 反向:test ! -e file1

3.2 判断式[]

判断式基本格式

x=1
[□$x□-le□0□]

注意为空格,在变量/常量/操作符间一定要有空格

commented

4. shell script的默认变量

当我们执行命令时,会带参数(执行操作,文件参数等)
我们在script中怎么读取这些参数,script内置了变量$#,$@,$num来表示这些参数

  • $# 参数个数
  • $@ 参数列表
  • $num 其中$0表示script名 $1..$num表示第num个参数
commented

5. 程序结构

5.1 判断结构

if结构

if [ 条件1 ] ; then
     代码段1
elif [ 条件2 ] ; then
    代码段2
esle 
    代码段3
fi

swicth结构

case $var in
       constant1 )
           代码段1
         ;;
       constant2 )
             代码段2
          ;;
         * )
             代码段 
          ;;
esac          

注意这里的swicth不能跨段,就是constant1后一定有;; constant可以是通配符,比如[Yy]

5.2 循环结构

while..done : 满足条件循环

while [ 条件 ]
do
   代码段
done

utile...done : 满足条件终止循环

util [ 条件 ]
do
   代码段
done

for...each : 循环遍历

for var in con1 con2 con3 ...
do
   代码段
done

例子

for filename in $(ls -al .)
do
    echo $filename
done

for...done : 条件遍历

s=0
for (( i=1 ; i <= $num ; i++ ))
do
    s=$(($s+$i))
done 
commented

6. function

function需要写在执行之前,因为script执行顺序是从上到下,从左到右
而且function内置有变量,跟script类似
需要返回值是使用return
例子:

function calnum (){
  if [ $1 -le 0 ] ; then
     return 1
  fi

   sum=0
   for (( i=1 ;  i<=$1 ; i++ ))
   do
      sum=$(($sum+$i))
   done
   echo $sum
   return 0
}