1、编写shell程序的步骤:

  1、创建以.sh为扩展名的文件  如:vi hello.sh

  2、编辑脚本文件

    1、第一行以“#!”开头,声明所使用的的shell的全路径

    2、脚本中适当增加注释。注释的语法以“#”开头     

#!/bin/bash
#打印输出hello.sh
echo "hello,world!"

  3、增加脚本文件执行权限 chmod 775 hello.sh

  4、运行脚本

    1、进入脚本文件目录,然后执行:./hello.sh

    2、以/bin/sh脚本名来运行,如:/bin/sh hello.sh

2、变量的定义和引用

  1、变量的定义:(1)shell中的变量名可以有字母、数字、下划线组成,但字母不能作为变量名的第一个字符

    (2)通过赋值符符号“=”来定义一个变量的值。

      如:myname='tang'  #字符串类型,不解析任何字符串

        courses=“asdfgh”  #双引号内部会解析$和反斜杠特殊字符

        sum=100;price=1.254

        now_time=`date`  #反引号执行系统命令

    shell的变量类型只有字符串类型,所以当你不用引号引起来的时候,要保证变量的值不包含特殊符号,如空格符、美元符、&符

  2、变量的引用:使用美元符号$加变量名,来引用一个变量的值

    如:定义变量:programe_name="httpd"

      引用变量:echo $programe_name  或  echo ${programe_name}

  3、变量名外面的花括号

    是可选的,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:  

#!/bin/bash
for skill in php java linux db2
    do
        echo "I am good at ${skill}Script"        #帮助shell解释器识别边界
    done
    #此处如果不加{},运行结果会怎样?

3、环境变量、局部变量以及预定义变量

  环境变量:指在操作系统中用来指定操作系统运行环境的一些参数,如:PATH,PWD,USER、当前使用的shell名称等

    常见的环境变量:PATH:系统路径

          HOME:当前用户的家

          HISTSIZE:保存历史命令记录的条数

          LOGNAME:当前用户登录名

          HOATNAME:主机名称。若应用程序要用到主机名称的话,一般是从这个环境变量中取的

          SHELL:当前用户用的那种shell

          LANG/LANGUGE:和语言相关的环境变量,使用多种语言的用户可以修改此环境变量

          MAIL:当前用户的邮件存放目录

    查看环境变量:env:显示所有环境变量。

         echo $PATH:显示某一个环境变量的值

  局部变量包括:

    1、在shell脚本中由用户定义的变量。shell脚本中由用户定义的变量作用域是从被定义的地方开始,到shell结束为止,起作用域为脚本,离开本脚本变量无效

    2、在用户登录的shell中定义的变量,重新登录后该变量消失

  预定义变量:预定义变量和环境变量相类似,也是在shell默认定义了的变量。所不同的是用户只能根据shell的定义来使用这些变量,而不能重新定义它,所有的预定义变量都是由$符和另一个符号组成,

    常用的shell预定义变量有:

      $#  位置参数的数量

      $*  所有位置参数的内容

      $@  所有位置参数的内容

      $n  n为数字,$0表示命令名称。$1表示命令第一个参数,以此类推

      $?  命令执行后返回的状态,0表示成功,非0表示失败

      $$  当前进程的进程号PID

      $!  后台运行的最后一个进程号PID。很少用,了解即可

      $0  当前执行的进程名。

      如:echo $0

4、脚本的输入输出

  1、echo 输出:命令发送数据到标准的输出设备

    echo两个重要的参数:

      -e:识别输出内容里的转义序列。echo -e "hello\tworld"  结果:hello world

      -n:忽略结尾的换行。ehco -e -n "hello\tworld"  结果:hello world[root@constos]$

  2、printf 输出:和echo类似,printf也可以输出变量,printf还可以安装格式输出变量。

    注:1、printf 的默认输出没有换行,换行需要自己加“\n”

      2、printf 支持格式化输出printf "Name:%s,Age:%d,Address:%s\n" $name $age $address

  3、read 输入。读取标准输入设备的下一行,标准输入中的新一行到换行符前的所有字符串都会被读取,并赋值给对应的变量,可以结合echo一起实现读取并输出的功能

[root@centos6 app]# vi read_echo.sh
#!/bin/sh
echo "please input your ipaddress"
read ipaddr
echo "my ip address is $ipaddr"

运行:sh read_echo.sh

结果:please input your ipaddress

   192.168.1.103

    给出输入提示的read用法:read -p "提示信息:" myaddr

      例:read -p "please input your username:" username

  4、<< 按行输入。可以被认为是一种重定向符。重定向脚本文件中的一行作为到一个命令的输入

    操作符<<被放在输入重定向的命令之后,紧跟在<<的各行命令的输入,输入的结尾通过文件结束符(ctrl+D)表示,也可以自己定义定界符,定界符后的单词作为输入各行的定界符

    注意结束时的定界符一定要顶格写。

    例:1、用<<符作为每一行的命令输入来操作数据库。    

[root@centos6 app]# vi operate_mysqldb.sh
#!/bin/sh
/usr/local/mysql5.6.17/bin/mysql <<!    #自定义定界符
status
select count(*) from test.student
!

      2、自动连接ftp服务器来下载数据

shell执行 docker Shell执行变量中的命令_环境变量

shell执行 docker Shell执行变量中的命令_环境变量_02

1 #!/bin/sh
 2 #演练用“<<”按行输入来上传下载文件
 3 ftpserver=192.168.1.100
 4 rq=`date+%Y%m%d`
 5 cd /root/jcy/mydocs
 6 ftp -i -n <<!
 7 open $ftpserver
 8 user oracle post
 9 cd ems
10 bin
11 get $rq.dat
12 bye
13 !

View Code