Linux 下访问 Windows 共享目录的配置方法

1. Linux 下安装 samba-client 客户端

1
yum install samba-client

2. Linux 下只能装 cifs-utils 软件包

1
yum install cifs-utils

3. Linux 下创建挂载点

1
mkdir /mnt/AutoBackup

4. 挂载 Windows 上的共享目录

1
mount -t cifs -o username="administrator",password='xxx' //192.168.200.1/D$/AutoBackup /mnt/AutosBackup/

如果挂载成功,则可以进入 /mnt/Autobackup 下,查看上面的 windows 共享文件。

Bat 的变量与命令 set 的用法

set 功能一览

  • [设置变量]
    格式:set 变量名=变量值
    详细:被设定的变量以 %变量名% 引用

  • [取消变量]
    格式:set 变量名=
    详细:取消后的变量名若被引用 %变量名% 将为空

  • [展示变量]
    格式:set 变量名
    详细:展示以变量名开头的所有变量及值

  • [列出变量]
    格式:set

  • [计算器]
    格式:set /a 表达式
    示例:set /a 1+2*3 输出 7

  • [设置变量为表达式计算后的值]
    set /a a=1+2
    注意区分:set a=1+2

  • [设置变量为用户输入的值]
    set /P a=

预定义的变量

下面是一些已经被底层定义好可以直接使用的变量:不会出现在 set 显示的变量列表中。

变量 含义
%CD% 当前目录字符串
%DATA% 用跟 DATE 命令同样的格式表示当前日期
%TIME% 用跟 TIME 命令同样的格式表示当前时间
%RANDOM% 表示0到32767之间的任意十进制数字
%ERRORLEVEL% 表示当前 ERRORLEVEL 数值
%PATH% 当前的环境变量,以分号隔开的路径列表

扩展变量

@ 与 $i 相关的变量(bat参数或者for循环的%i)
@ 与 %VAR% 相关的变量

|变量|含义|
|%0|脚本的路径名|
|%~x0|当前脚本后缀|
|%~n0|当前脚本文件名,不包含后缀|
|%~nx0|当前脚本文件名,注意跟%0区分|
|%~dp0|当前脚本工作目录
|%VAR:str1=str2%|会将VAR中的str1替换为str2,如str2为空可以起到删除效果,str1可以加*通配符|
|%VAR:~0,-2%|提取VAR变量的所有字符,除了最后两个|
|%VAR:~2%|提取VAR变量除前两个外的所有字符|
|%VAR:~-2%|提取VAR变量的最后两个字符|
|%VAR:~2,5%|提取从第2个字符开始的5个字符|

Bat 之 for 循环

1. 没有任何参数的 for

格式为:for %%i in (set) do command

%%i 为变量
set 为一个文件或者一组文件,其实就是一个集合。可用通配符,比如 *.log。
command 是要执行的命令。

例子:你想显示当前目录下扩展名为 log 的文件,可以使用 dir *.log,for 也可以实现:

1
for %i in (*.log) do echo %i

for 会先从括号里面执行,因为括号里面是 *.log,所以 for 会得到当前目录下所有扩展名是 mp3 的文件,并把它们作为一个集合,而每个文件名就是一个元素,像这样{1.log,2.log},然后用 %%i 依次替代每个元素,之后做 do 后面的命令。当前 () 里面不局限于一个文件或者通配符,可以有多个通配符。

2. 含有 /L 的 for

格式为:for /L %%i in (start, step, end) do command

这个表示以增量形式从 start 到 end 的一个数字序列,步长是 step,就是每次的增量是 step

例子:显示 1 到 5 之间的数字,可以如下:

1
for /L %%i in (1, 1, 5) do echo %%i

例子:同时打开 3 个记事本程序:

1
for /L %%1 in (1, 1, 3) do notepad.exe

如何理解呢?先从括号开始执行,产生集合,然后用 %%i 依次替代集合中的每个元素,之后执行 do 后面的命令,上面的例子可以看出我们不是必须在 do 后面的命令中使用到 %%i 的,但是这不能阻止 %%i 的每次替代。

3. 含有 /F 的 for

格式:
for /F [“options”] %%i in (file) do command
for /F [“options”] %%i in (string) do command
for /F [“options”] %%i in (command) do command

最常用的,也是最强的命令,主要用来处理文件和一些命令的输出结果。

file 代表一个或多个文件
string 代表字符串
command 代表命令
[“options”] 可选

我们以第一个为例,for 会依次将 file 中的文件打开,并且在进行到下一个文件之前将每个文件读取到内容,按照没一行分成一个一个的元素

例子:

1
2
3
4
5
6
7
8
9
10
for /F  %%i in (a.txt) do echo %%i
for /F "tokens=1,2 delims= " %%i in (a.txt) do echo %%i %%j
for /F "tokens=* delims= " %%i in (a.txt) do echo %%i
for /F "skip=2" %%i in (a.txt) do echo %%i
for /F "eol=2" %%i in (a.txt) do echo %%i

D:\>type a.txt
第1行第1列 第1行第2列 第1行第3列
第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列

delims 用来告诉 for 每一行应该拿什么作为分隔符,默认分隔符是空格和tab键,当通过 delims 将每一行分为更小的元素时由它来控制要取哪一个或哪几个,skip 表示忽略文件的前多少行,而 eol 用来指定当一行以什么符号开始时,就忽略它。

inotify 报错 upper limit on inotify watches reached

在对一个大磁盘进行 inotify 监听时,爆出如下错误:

1
2
3
Failed to watch /mnt/;
upper limit on inotify watches reached!
Please increase the amount of inotify watches allowed per user via `/proc/sys/fs/inotify/max_user_watches’.

cat一下这个文件,默认值是8192,echo 8192000 > /proc/sys/fs/inotify/max_user_watches 即可~

PHP 流程控制

任何 PHP 脚本都是由一系列语句构成的。一条语句可以是一个赋值语句,一个函数调用,一个循环,一个条件语句或者甚至是一个什么也不做的语句(空语句)。语句通常以分号结束。此外,还可以用花括号将一组语句封装成一个语句组。语句组本身可以当作是一行语句。

Read More

PHP 常量

常量是一个简单值的标识符(名字)。如同其名称所暗示的,在脚本执行期间该值不能改变。常量默认大小写敏感。传统上常量表示总是大写的。
常量名和其它任何 PHP 标签遵循同样的命名规则。合法的常量名以字母或下划线开始,后面跟着任何字母,数字或下划线。
常量的范围是全局的,不用管作用区域就可以在脚本的任何地方访问常量。

Read More

PHP String 字符串类型

语法

一个字符串可以用 4 种方式表达:

  • 单引号
  • 双引号
  • heredoc 语法结构
  • nowdoc 语法结构(PHP 5.3.0起)

单引号

定义一个字符串的最简单的方法是用单引号把它包围起来(字符’)。
要表达一个单引号自身,需要在它的前面加个反斜线(\)来转义。要表达一个反斜线本身,则用两个反斜线(\)。其它任何方式的反斜线都会被当成反斜线本身:也就是说如果想使用其它转义序列例如 \r 或 \n,并不待变任何特殊含义,就单纯是这两个字符本身。

双引号

如果字符串是包围在双引号(”)中,PHP 将对一些特殊的字符进行解析:

序列 含义
\n 换行(ASCII 字符集中的 LF 或 0x0A(10))
\r 回车(ASCII 字符集中的 CR 或 0x0D(13))
\t 水平制表符(ASCII 字符集中的 HT 或 0x09(9))
\v 垂直制表符(ASCII 字符集中的 VT 或 0x0B(11)(PHP 5.2.5起)
\e Escape(ASCII 字符集中的 ESC 或(0x1B(27)))(PHP 5.4.0起)
\f 换页(ASCII 字符集中的 FF 或 0x0C(12))(PHP 5.2.5起)
\ 反斜线
\$ 美元标记
\” 双引号
[0-7]{1,3} 符合该正则表达式序列的是一个以八进制方式来表达的字符
\x[0-9A-Fa-f]{1,2} 符合该正则表达式序列的是一个以十六进制方式来表达的字符

和单引号字符串一样,转义任何其它字符都会导致反斜线被显示出来。用双引号定义的字符串最重要的特征是变量会被解析。

Heredoc 结构

第三种表达字符串的方法是用 heredoc 语法结构:<<<。在该字符串之后要提供一个标识然后换行。接下来是字符串本身,最后要用前面定义的标识符作为结束标志。结束时所引用的标识符必须在该行的第一列,而且,标识符的命名也要像其它标签一些遵守 PHP 的规则:只能包含字母、数字和下划线,并且必须以字母和下划线作为开头。
Heredoc 结构就像没有使用双引号的双引号字符串,这就是说在 heredoc 结构中单引号不用被转义,但上下文中列出的转义序列还可以使用。变量将被替换,但在 heredoc 结构中含有复杂的变量时要格外小心。

Nowdoc 结构

就像 heredoc 结构类似于双引号字符串,Nowdoc 结构是类似于单引号字符串的。Nowdoc 结构很像 heredoc 结构,但是 nowdoc 不进行解析操作。这种操作很适合用于嵌入 PHP 代码或其它大段文本而无需对其中的特殊字符进行转义。
一个 nowdoc 结构也用和 heredoc 结构一样的标记 <<<,但是跟在后面的标识符要用单引号括起来,即 <<<’EOT’。Heredoc 结构的所有规则也同样适用于 nowdoc 结构,尤其是结束标识符的规则。

变量解析

当字符串用双引号或 heredoc 结构定义时,其中的变量将会被解析。

这里共有两种语法规则:简单规则、复杂规则。简单的语法规则是最常用和最方便的,它用最少的代码在一个 string 中嵌入一个变量,一个 array 的之,或一个 object 的属性。复杂规则越发的显著标记是用花括号包围的表达式。

简明语法

当 PHP 解析器遇到一个美元符号($)时,它会和其它很多解析器一样,去组合尽量多的标识以形成一个合法的变量名,可以用花括号来明确变量名的界线。

复杂(花括号)语法

复杂语法不是因为其语法复杂而的名,而是因为它可以使用复杂的表达式。
任何具有 string 表达的标量变量,数组单元或对象属性都可使用此语法。只需简单的像在 string 以外的地方那样卸出表达式,然后用花括号 { 和 } 把它括起来即可。由于 { 无法被转义,只有 $ 紧挨着 { 时才会被识别。可以用 {\$ 来表达 {$。

存取和修改字符串中的字符

string 中的字符可以通过一个从 0 开始的下标,用类似 array 结构中方括号包含对应的数字来访问和修改,比如 $str[42]。可以把 string 当成字符组成的 array。

注:超出字符串长度的下标将会拉长该字符串并以空格填充。非整数类型下标会被转换成整数。非法下标类型(如-负数下标)会产生一个 E_NOTICE 姐别错误,负数下标读取字符串返回空字符串。写入时只用到赋值字符串的第一个字符。用空字符串赋值则赋给的值是 NULL 字符。

字符串可用 ‘.’(点)运算符连接起来。

字符串类型详解

PHP 中的 string 实现方式是一个由字节组成的数组再加上一个整数指明缓冲长度。并无如何将字节转换成字符的信息。字符串由什么值来组成并无限制。
字符串类型的此特性解释了为什么 PHP 中没有单独的 “byte”类型-已经用字符串来代替了。返回非文本值的函数-例如从网络套接字读取的任意数据-仍会返回字符串。
由于 PHP 并不指明字符串的编码,那字符串到底是怎样编码的呢?答案是字符串会被按照该脚本文件相同的编码方式来编码。

PHP boolean 布尔类型

这是一个最简单的类型,可以为 TRUEFALSE。如果要指定一个布尔值,使用关键字 TRUEFALSE 即可,不区分大小写。通常运算符所返回的 boolean 值结果会被传递给流程控制。

1
2
3
4
// == 是一个操作符,它检测两个变量是否相等,并返回一个布尔值
if($action == "show_version"){
echo "The version is 1.23";
}

可以明确使用 (bool) 或者 (boolean) 来强制转换一个值为 boolean。大多数情况下不需要强制转换,因为当运算符,函数或流程控制结果需要一个 boolean 参数时,该值会被自动转换。

当转换为 boolean 时,以下值被认为是 FALSE

  • 布尔值 FALSE 本身
  • 整型值 0(零)
  • 浮点型值 0.0(零)
  • 空字符串以及字符串”0”
  • 不包括任何元素的数组
  • 不包括任何成员变量的对象(PHP 4.0适用)
  • 特殊类型 NULL(包括尚未赋值的变量)
  • 从空标记生成的 SimpleXML 对象

所有其它值都被认为是 TRUE(包括任何资源)。
注:-1 和其它非零值(无论正负)都被认为是 TRUE

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@mail ~]# cat php_boolean.php 
<?php
var_dump((bool) "");
var_dump((bool) 1);
var_dump((bool) -2);
var_dump((bool) "foo");
var_dump((bool) 2.3e5);
var_dump((bool) array(12));
var_dump((bool) array());
var_dump((bool) "false");
var_dump((bool) false);
?>
[root@mail ~]# php php_boolean.php
bool(false)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(false)
bool(true)
bool(false)

PHP 类型简介

PHP 支持 8 种原始数据类型。

标量类型

  • boolean(布尔型)
  • integer(整型)
  • float(浮点型,也称作 double)
  • string(字符串)

复合类型

  • array(数组)
  • object(对象)

特殊类型

  • resource(资源)
  • NULL(无类型)

变量的类型通常不是主动设定的,确切的说是由 PHP 根据该变量使用的上下文在运行时决定的。

如果想查看某个表达式的值和类型,可以使用 var_dump() 函数。如果只是想得到一个易读懂的类型的表达式方式用于调试,用 gettype() 函数。要查看某个类型不要用 gettype(),而用 is_type 函数,以下是范例及执行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@mail ~]# cat php_type.php 
<?php
$a_bool = TRUE;
$a_str = "foo";
$a_str2 = 'foo';
$an_int = 12;

echo gettype($a_bool) . "\n";
echo gettype($a_str) . "\n";

if(is_int($an_int)){
$an_int += 4;
echo $an_int . "\n";
}

if(is_string($a_bool)){
echo "String: $a_bool \n";
}else{
echo "Not String: $a_bool \n";
}
[root@mail ~]# php php_type.php
boolean
string
16
Not String: 1

PHP 的 feof() 方法需要注意的地方

写过这样的一段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
# 读取用户列表文件
function GetUserInfo($file){
if(file_exists($file)){
$file_handle = fopen($file,"r");
while(!feof($file_handle)){
$line = fgets($file_handle);
var_dump($line);
}
fclose($file_handle);
}
}
GetUserInfo("/root/user.list");
?>

其中当读文件到结尾的时候,结果总会比期望的多出来一个元素:bool(false)。

按说,如果读取到文件最后一行,feof 函数会返回 TRUE,然后 while 循环就退出了,为什么不是呢?

先看例子,我们在代码中添加一个判断:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
# 读取用户列表文件
function GetUserInfo($file){
if(file_exists($file)){
$file_handle = fopen($file,"r");
while(!feof($file_handle)){
$line = fgets($file_handle);
if(feof($file_handle)){
break;
}
var_dump($line);
}
fclose($file_handle);
}
}
GetUserInfo("/root/user.list");
?>

这是因为 feof 函数在处理纯文本文件的时候处理到最后一行后,feof($file_handle) 将不会返回 True,此时循环继续,使用 fgets 继续读取文件,由于 fgets 获取不到数据,返回 false,所以我们使用 var_dump 可以看到打印了一个布尔类型的值,解决办法是使用 fgets 后再次使用 feof 判断文件是否结束,此时可以正确判定文件是否已到末尾。