定义变量

+ 定义时,变量名前面不能够加 $

  • 变量名与 = 之间不能够有空格

  • 变量名,首字符必须为字母([A-Za-z]+),中间不能够有空格,不能够使用标点符号,不能够使用 bash 里的关键字,可以使用下划线(_)。

使用变量

  • 在变量名前面加 $ 即可。

  • 变量名可以选择用花括号括({})起来,主要是为了帮助解析器识别变量的边界。

只读变量

  • 使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

#!/bin/sh name="lizs" readonly name name="lzs"

运行以上脚本将会报错:name: is read only

删除变量

  • 使用 unset 命令可以删除变量

  • unset 不能够删除只读变量


#!/bin/sh name="lizs" unset name echo $name

运行以上命令的输出为空

  • ##### 如果 shell 函数中没有 return 返回值,则函数的返回值是该函数的执行状态:0,成功;1,失败。注意,shell 函数 return 返回的值只能够是整数 。

  • ##### 想要在 shell 函数中返回特定的值,可以通过将需要返回的值输出到标准输出中来传递给主程序变量。


#!/bin/sh do_check() { if ps -ef | grep php5-cgi | grep -v grep > /dev/null then echo "php5-cgi is running..." else echo "php5-cgi is not running..." } RESULT=`do_check` echo RESULT # 输出:php5-cgi is running 或 php5-cgi is not running echo $? # 如果函数成功执行,输出 0;否则,输出 1
  • 因为,shell 赋值默认为字符串,所以要用命令替换符(\`)。否则,`RESULT` 的值为字符串 `do_check`。
    
  • `$?`:上个命令的退出状态,或函数的返回值
    

方法一


#!/bin/sh ProName=php5-cgi ProCount=`ps -ef | grep $ProName | grep -v grep | wc -l` if [ $ProCount -gt 0 ]; then echo $ProName is running... else echo $ProName not fount! fi
  • grep -v grep:忽略 grep 本身

  • wc -l: 统计返回的行数

方法二


#!/bin/sh ProName=php5-cgi if ps -ef | grep $ProName | grep -v grep > /dev/null then echo "$ProName is running ..." else echo $ProName is not running


#!/bin/sh ProName=php5-cgi ps -ef | grep $ProName | grep -v grep > /dev/null if [ $? -eq 0 ]; then echo "$ProName is running ..." else echo $ProName is not running
  • > /dev/null:将 stdout 输出到 /dev/null (空设备、黑洞设备)里面去,不让 stdout 信息显示出来,是处理不需要信息的一种常用手段。

  • $?:上个命令的退出状态,或函数的返回值


#!/bin/sh if [ ! -d "~/app/backup" ]; then mkdir "~/app/backup" fi time=$(date +%Y%m%d%H%M%S) # Backup project tar zcvf ~/app/backup/projectName_${time}.tar.gz ~/app/projectName if [ -f "~/app/backup/projectName_${time}.tar.gz" ]; then echo "It's successful to backup project" fi #Backup database mysqldump -u"userName" -p"password" dbName > ~/app/backup/dbName_${time}.sql if [ -f "~/app/backup/dbName_${time}.sql" ]; then echo "It's successful to backup database" fi

read

  • 简单的输入示例:read.sh
#!/bin/bash

read name
echo "welcome $name"

执行结果:

$ ./read.sh 
lizs     // shell 脚本会等待输入变量值
wecome lizs

  • 带提示的输入,可以在前面 echo 一句话,或者用 -p 来实现:
#!/bin/sh
read -p "please input your name: " name    
echo "welcome $name"

执行效果和上面一样。

  • 输入多个变量,
#!/bin/sh
read -p "please input your name: " firstname lastname
echo "welcome lastname"

执行结果:

$ ./read.sh
please input your name: hello world
welcome hello world

  • shell 编程开头:#!/bin/bash#!/bin/sh
  • shell 是弱类型语言,都是字符串(可以通过特殊声明,来定义数值类型变量)。
  • shell 中变量的引用格式:$varvar是变量的名称。
  • shell 编程文件必须要有执行权限。chmod +x file

  • shell 脚本执行(如,test.sh):

    • shell 脚本不在当前目录下面:
      • 用全局路径执行文件。如
        /home/lizs/test.sh
      • 用相对路径执行文件。如
        ../test.sh
    • shell 脚本在当前目录下。
      • ./.。如
        $ ./test.sh
        $ . test.sh // 注意 '.' 后面有空格
      • source,如:
        source test.sh
      • bash,如:
        bash test.sh
    • 在任何目录下实现 shell 脚本的直接执行。
      • 将 shell 脚本放在 /usr/bin/ 目录下,如果是自己写的小程序脚本,不建议放在里面。
      • 在用户目录下的 .bashrc 文件中添加脚本的目录路径作为环境变量。这种方法只针对当前使用的用户有效,而且.bashrc 文件在每次打开新的终端时会被读取。所以,添加了新的环境变量之后,要在新打开的终端才能生效。
        export PATH="$PATH:/home/lizs/app/"

  • *:代表任意长度的任意字符。
  • ?:代表一个任意字符。
  • []:代表一个指定范围内的字符。比如,[abc123],代表abc123中的一个字符。
  • [^]:代表一个指定范围外的字符。比如,[abc123],代表除了abc123之外的一个字符。

$ touch file file1 file2 file3 file123
$ l
file  file1  file123  file2  file3
  • *
$ l file*
file  file1  file123  file2  file3
  • ?
$ l file?
file1  file2  file3
  • []
$ l file[123456]
file1  file2  file3
  • [^]
$ l file[^12]
file3

systemctl (centos7)

  • 启动服务:
    systemctl start x.service
    
  • 关闭服务:
    systemctl stop x.service
    
  • 重启服务:
    systemctl restart x.service
    
  • 查看服务状态:
    systemctl status x.service
    
  • 开机启动服务:
    systemctl enable x.service
    
  • 开机不启动服务:
    systemctl disable x.service
    
  • 查看所有服务:
    systemctl list-units --type=service 
    

ntpdate

  • 更新服务器时间
    ntpdate -u ntp.api.bz
    

    ntp.api.bz: NTP 服务器(上海)