当前位置: 首页 > 工具软件 > C Script > 使用案例 >

shell script简介

宗苗宣
2023-12-01

1 什么是shell script?

    shell script是通过shell 的功能所写的一个program,这个程序 是使用纯文本文件,将一些shell的语法与命令写在里面 ,搭配正则式,管道命令和数据流重定向等功能,以达到我们所想要的功能。

2.1  编写第一个script

#!/bin/bash
# this is first shell script
# printf Hello World
echo -e "Hello World \a \n"
exit 0

​

 第一行 #!/bin/bash shen声明使用的是哪一个shell

其余的 # 后面的内容都为注释。

ehco 那一行即为主程序。 这一行的内容是 打印 Hello World。 -e参数代表识别"" 中 需要显示内容的特殊字符。 这里\a 即为发出警告声,\n 为换行。

exit 0为告知程序执行结果,执行完脚本后,可以通过 echo $? 这一句命令来判断上一个命令的执行结果。

2.2 script 的执行方式区别

  1.  利用直接执行的方式

            在命令行下直接执行绝对路径或者相对路径,或者sh script.sh

            这种执行方式 script是在子进程的bash内执行。当子进程完成后,子进程内的各项变量或操作将会结束而不会传回父进程。            

    2 .利用source来执行脚本。

          # source script.sh

            这个script就会在这个bash  内部生效。这也是为什么不注销系统的时候,修改.bashrc 里面的配置并使其生效的时候,使用source ~/.bashrc 而不是 sh  ~/.bashrc。

3 script中常用的命令和判断式

3.1 test 命令

tset 命令用来检测系统上面某些文件或者是相关的属性。

     例如:

         test -e ./test .sh && echo “exit”|| echo “not exit”

         这句命令是判断test.sh这个文件存不存在,然后再命令行中打印相关结果,如果存在就打印exit,反之就打印not exit。

Test后面接的常用命令解释: test -e file

   关于某个文件名的文件类型的判断

     -e 该文件名是否存在、

     -f 该文件名是否存在且为文件

     -d 该文件名是否存在且为目录

   关于文件权限的检测:test -r file

     -r 检测该文件名是否存在且具有 可读 权限

     -w 检测该文件名是否存在且具有 可写 权限

     -x 检测该文件名是否存在且具有 可执行 权限

     -s 检测改文件名是否存在且为 非空白文件

   两个文件之间的比较:test file1 -nt file2

     -nt (newer than)判断文件1 是否比文件2 新。

     -ot  (older than ) 判断文件1 是否比 文件2 旧。

     -ef  判断文件1  和文件2  是否是同一个文件,可用在判断hard link的判定上。 主要是判断两个文件是否指向于同一个inode。

   两个整数之间的判断:test n1 -eq n2

     -eq 两个数是否相等

     -ne 两个数字是否不等

     -gt  n1 是否大于n2

     -lt  n1 是否小于n2

     -ge  n1 是否大于等于n2

     -le  n1是否小于等于n2

判断字符串的数据:

 Test -z string 判断字符串是否为0,如果为空字符串,则为true

 Test -n string 判断字符串是否不为0,如果为空字符串,则为false

             注意:-n可以省略

 Test str1 = str2 判断str1 和str2 是否相等,相等则为true

 Test str1 != str2 判断str1 和str2 是否不相等,相等则为false

多重条件判断:

 -a 两个条件同时成立。 test -r file -a -x file,当文件同时具有可读和可执行权限的时候,才为true

-o 任意一个条件成立。test -r file -o -x file,当文件同时具有可读或者可执行权限的时候,就为true

! 反向的状态。 test ! -x file 当file不具有x时,则为true。

3.2 利用 判断符号[]

[ -z $HOME ]; echo $?

  上面是判断HOME这个变量是否为空。中括号的使用方法和test几乎一样,只是中括号常用于添加判断式中。后面会讲到。

 

注意事项:

  1 在中括号[]里面的每一个组件都要有空格键来隔开。

  2 在中括号[]里面的变量都以双引号来括号起来。

  3 在中括号[]里面的常量都以双引号或单引号来括号起来。

 

譬如:

  Name = shell sh

  [ $NAME == “sh” ] 这是不对的,会报 bash: [: too many argument

  上面判断会等于[ shell sh == “sh” ] 一个判断式仅能有两个数据,但是这个判断式有三个数据了。应该 [ “shell sh” == “sh” ]才对。

hyz@ubuntu:~/test$ cat zhongkouhao.sh 
#!/bin/bash
# Program:
# show user choice
# History:
# 2019/08/11

read -p "Please Input you choice Y/N:" choice
[ "$choice" == "y" -o "$choice" == 'Y' ] && echo "OK,continue" && exit 0
[ "$choice" == "n" -o "$choice" == 'N' ] && echo "not ok,interrupt" && exit 0
echo "I do not know you choice" && exit 0 

上面就是读到控制台的参数,然后进行判断和相关的打印。

3.3 shell script的默认变量 $0 $1

Script 针对变量名是已经有设置好一些变量名称了。

 

/shell/var.sh opt1 opt2 opt3 opt4 

    $0     &1  &2  &3  &4

特殊变量:

  $#: 代表后面接的参数的个数

  $@: 代表”$1” ,“$2”, “$3”

  $*:  代表 “$1c$2c$3c”,其中c为分隔字符,默认为空格键。

Shift:造成参数变量号码偏移。

hyz@ubuntu:~/test$ cat var.sh 
#!/bin/bash
# Program:
# show script name,par and so 
# History:
# 2019/08/11

echo "total par numver is : $#"
echo "you whole pa is  '$@' "
echo "you whole par is $* "
echo "the firtt numver is $1"
shift 
echo "total par numver is : $#"
echo "you whole pa is  '$@' "
shift 2
echo "total par numver is : $#"
echo "you whole pa is  '$@' "

hyz@ubuntu:~/test$ source var.sh  one two three four five
total par numver is : 5
you whole pa is  'one two three four five' 
you whole par is one two three four five 
the firtt numver is one
total par numver is : 4
you whole pa is  'two three four five' 
total par numver is : 2
you whole pa is  'four five' 

4 条件判断式

4.1 if...then

单层判断式:

  if [条件判断]; then

     条件成立时的操作

  fi

可以将所有条件写入一个中括号里面也可以写入多个中括号用 && 或者|| 来隔开。

 [ “$choice”  ==  “Y” -o “$choice”  ==  ‘y’ ]

等同于:

 [ “$choice”  ==  “Y” ] || [  “$choice”  ==  ‘y’ ]

 

多重条件判断式:

 if [条件判断1]; then

   条件1成立干的事

 elif [条件判断2 ]; then

   条件1 不成立,条件2成立 做的事

 else

   条件1 和条件2 都不成立干的事

 fi

 

4.2 case..esac

  case $变量名称 in

     第一个变量内容

          程序段

      ;;

      第二个变量内容

          程序段

      ;;

      *)

        不包括第一个变量和第二个变量的执行程序段

         exit 1;

       ;;

   esac

    

4.3 function

Function fname(){

    程序段  

}

 

因为shell script的执行是由上而下 由左向右,所以function都需要设置在程序的最前面。

另外,Function也是拥有内置变量的,他的内置变量与shell script类似,函数名称代表$0,后续的变量也是以$1 $2 Kauai代替的。

hyz@ubuntu:~/test$ cat funtion.sh 
#!/bin/bash
# Program:
# user fucntion print information 
# History:
# 2019/08/11
function print(){
  echo "you choice is $1"
}

echo "Thsi program will print you selection"
case $1 in
    "one")
         print 1
         ;;
    "two")
         print 2
         ;;
     *)
         echo "Usage $0 [one|two]"
         ;;
esac
hyz@ubuntu:~/test$ source funtion.sh one
Thsi program will print you selection
you choice is 1
hyz@ubuntu:~/test$ source funtion.sh three
Thsi program will print you selection
Usage bash [one|two]

5 循环 loop

 5.1 while do done,until do done (不定时循环)

     伪代码:

       While [conditon]

       do

         Program

       done

      当 condition成立的时候就进行循环。

      

       Until [conditon]

       do

          Program

       done

       当condition成立的时候终止循环。

 5.2 for...do...done (定时循环)

      for var in con1 con2 con3

      do

         Program

      done

      $var 的变量内容在循环工作时一直在改变:

        1 第一次循环,$var 为con1

        2 第二次循环,$var 为con2

        3 第三次循环,$var 为con3

         ......

      

     for var in $(seq 1 100)

        $var的变量的内容是 从1 到100 ,seq是指连续的意思。

 

另外一种写法:

   for ((初始值;限制值;执行步长))

   do

        Program

   done

     

    和c语言类似:

初始值: 某个变量在循环当中的初始值,直接以类似i =1设置好;

限制值: 当变量的值在这个限制值的范围内,就继续进行循环,例如i<100;

执行步长: 没做一次循环,变量的变化值,例如i=i+1;

hyz@ubuntu:~/test$ cat for.sh 
#!/bin/bash
# Program:
# printf 1+2+...+n  
# History:
# 2019/08/11
read -p "Please input a number,I will cont for 1+2+...+n: " nu

s=0
for (( i=1; i<=$nu; i++ ))
do
    s=$(( $s + $i ))
done
echo "The result is $s"
hyz@ubuntu:~/test$ source for.sh 
Please input a number,I will cont for 1+2+...+n: 5
The result is 15
hyz@ubuntu:~/test$ 

 

6 shell script 的追踪和调试

  # sh [-nvx] script.sh

  -n 不要执行script,进查询语法的问题

  -v 在执行script的时候,先将script你们的内容输出到屏幕上

  -x 将使用到的script内容显示到屏幕上

 

由sh -x的方式来将命令执行过程也显示出来,如此用户可以判断程序代码执行到哪一段时会出现相关的信息。

 

感谢linux鸟哥的私房菜。

 类似资料: