shell变量之辨[7]

阅读全文

[局部变量]

a="global";
function func()
{
    a="func_global";
    echo "in func: a = $a";
}

function func2()
{
    local a="func2_local";
    echo "in func2: a = $a";
}

echo "a = $a";
func;
echo "a = $a";
func2;
echo "a = $a";
在函数中可以通过”local”的方式标明变量只在局部使用, 也就是说在fun2中, 我们通过local将变量设置为了只在函数内部使用. 因此它的赋值等操作不会影响函数之外的同名变量.
局部变量能让我们方便地使用递归..但是我们非常不推荐:
慢, 可能容易栈溢出

The post shell变量之辨[7] appeared first on 邮递员大叔.

阅读全文>>

shell变量之辨[6]

阅读全文

[变量的类型?]

看看下面的a, b在不同的时候分别是什么类型?
#!/bin/bash
a="1234"
let "a += 1"
echo "a = $a";

b=${a/23/AB};
echo "b = $b";
b=1234
echo "b = $b";
b=abcd
echo "b = $b";

b=${a/23/AB};
declare -i b
echo "b = $b";
b=1234
echo "b = $b";
b=abcd
echo "b = $b";
shell是不区分变量类型的, 我们使用它的时候它会自动选择我们所需要的类型. 就如同上面的第一段代码, a是字符串, 但是让它做加法运算, 很自然地会把它当成数字, 输出: a = 1235 再看第二段, b被赋值为${a/23/AB}, 即将a中的"23"替换为"AB", 输出的即为: b = 1AB5 再接下来, b被重新赋值为1234这样的一个"Int", 或者是abcd这样的"String", 很自然地, 输出为: b = 1234 b = abcd 但是, 我们在第三段代码中使用了一个"declare -i", 这个就很神奇了. declare是显式指明变量类型, -i表示int. 输出的结果是这样的: b = 1AB5 b = 1234 b = 0 当b已经是一个字符串1AB5的时候, 输出的值表明它并没有什么变化, 接下来我们赋值为1234这样的int, 也很正常. 但是再次将其赋值为一个字符串, 它表现出来的现象和刚刚第二段就不同了. 输出的内容是0, 即字符串"abcd"被当成一个int类型时, 数值为0    

The post shell变量之辨[6] appeared first on 邮递员大叔.

阅读全文>>

shell变量之辨[5]

阅读全文

[神奇的文件描述符2]

文件描述符
0: 标准输入; 1: 标准输出; 2: 标准错误输出; 因此我们使用3-9
$CMD >> xx.log 2>&1  什么意思? * 执行$CMD命令, 将其标准输出重定向至xx.log, 在文件末尾添加(>>), 同时将标准错误输出也指向标准输出(即也输出至xx.log) 我们可以使用3~9的文件描述符来描述自定义的文件, 上一讲中说到循环中有ssh命令会导致循环失效, 然而使用文件描述符就不会再有这样的情况. 因此我们通常的使用方式是:
#! /bin/bash
echo -e "1\n2\n3\n4" > "$0.txt";
exec 3<> $0.txt	#注意3和<>之间没有空格

while read line <& 3	#注意此处写在while行之后, 而不是done之后
do
    echo "$line";
    ssh "db-testing-ps1833.db01" "ls > /dev/null"
done
这样的话, 输出的结果就是符合我们预期的4行内容啦! [神奇的文件描述符3]
#!/bin/bash
lftp ftp://db-testing-ps1833.db01/home/work/mc-tools <<!
        ls -l;
        bye;
!

ssh db-testing-ps1833.db01 <<!
ls /home/work/mc-tools
!

<<COMMENT
echo hello
COMMENT
看看以上这段代码, 其中使用了这样的形式:
<<delimiter
****
delimiter
它的用处一般有两个:
1. 交互式的行为, 例如通过lftp远程执行命令; ssh远程执行命令等
2. 注释(多行注释)
其中delimiter只要前后确认相同即可, 一般可以使用一些有意义的, 比如COMMENT表示注释之类
 

The post shell变量之辨[5] appeared first on 邮递员大叔.

阅读全文>>

shell变量之辨[4]

阅读全文

[函数,函数!]

#! /bin/bash
function func()
{
    echo "I am func";
    echo "xx" >& 2
    return $1
}

a=`func 1`;
echo "begin";
echo "$?";
echo "$a"
echo "end"
echo "----------"

echo "begin";
b=$(func 2);
echo "$?";
echo "$b";
echo "end";
1.  如何获得return的值? 答案: $? 2.  如何获得”echo”的值(I am func) 答案: ``和$()
3.  echo “xx” >&2和echo “xx” >& 1是什么意思? 答案: 文件描述符, >& 1 表示输出至"标准输出", >& 2 表示输出至"标准错误输出"
[神奇的文件描述符]
#! /bin/bash
echo -e "1\n2\n3\n4" > "$0.txt";
while read line		# 还有一种方式和此等价: cat 文件名 | while….
do
    echo "$line";
#   ssh "db-testing-ps1833.db01" "ls > /dev/null"
done < “$0.txt”	#注意<写在done后面, 而不是写在while一行之后
如果没有ssh这一行, 无疑结果就是输出1 2 3 4,分别一行
但是如果在循环中增加了ssh呢? 变成了只输出一行..what a f**king day…
这代表, 我们在循环的时候, 中途由于ssh命令, 导致后面的循环没有进行!
这一个错误非常隐蔽, 没有经验的同学再怎么看代码, 也会坚持认为自己的程序没有任何逻辑上的错误.
错误的原因不赘述, 如何解决? 且听下回分解

The post shell变量之辨[4] appeared first on 邮递员大叔.

阅读全文>>

shell变量之辨[3]

阅读全文

[裸体变量]

什么时候不需要前面的”$”
1. 赋值  a=12+3
2.使用let赋值  let a=12+3
3. for循环
4. read读取变量
#!/bin/bash
a=12+3
echo "$a"

let a=12+3
echo "$a"

for a in 1 2 3
do
	echo -n "$a "
done
echo

read a
echo "$a"
输出为: 12+3 15 1 2 3 123456 123456 [获取命令结果]
如何将一个shell命令的输出结果赋值给变量?
例如让a变量为ls -l的结果(这样的特性非常重要, 我们可以从其他shell命令结果中获取许多有用的结果, wc -l, pwd, readlink -f, ls, date…)
两种方式:
a=`ls -l`;
a=$(ls -l);
#! /bin/bash
a=`ls -l`;
echo "$?"
echo "$a";
echo "____";

b=$(ls -l);
echo "$?"
echo "$b";
echo "____"

c=`ls -l /xxx`;
echo "$?"
echo "$c";
echo "____";

d=$(ls -l /xxx);
echo "$?"
echo "$d";
echo "____"
输出结果自己试一试吧~~

The post shell变量之辨[3] appeared first on 邮递员大叔.

阅读全文>>

shell变量之辨[2]

阅读全文

[大括号的作用]

我们经常在使用一个变量的时候, 用{}将其包住, 为什么?
#! /bin/bash
xxoo="I am 1";
xxoo2="I am 2";
echo $xxoo2
echo ${xxoo}2
echo ${xxoo2}
猜一猜, 输出结果是? 大括号在shell中, 用于防止变量名称的混淆, 大括号括起来之后表示一个完整的变量名称, 防止中间即被截断 上面的一段代码, 输出的内容是: I am 2 I am 12 I am 2 [变量的引用和替换]
#! /bin/bash
xxoo="a b   c                   d";
echo $xxoo
echo "$xxoo"
echo '$xxoo'
echo \$xxoo
echo "\$xxoo“
让我们猜一猜, 这种情况下的运行结果? 不使用双引号: 变量替换, 和echo a b    c            d这样形式的结果一样 双引号: 弱引用; 单引号: 强引用 因此实际上, 上面一段程序的输出是: a b c d a b   c                   d $xxoo $xxoo $xxoo

The post shell变量之辨[2] appeared first on 邮递员大叔.

阅读全文>>

shell变量之辨[1]

阅读全文

来baidu之后, 经常使用到shell脚本. shell脚本功能比较简单, 但因为可以方便地使用linux自带的很多命令, 因此使得shell脚本在平时的工作中依然能够发挥非常大的作用. 之前做了一份ppt, 主要针对shell变量的许多使用方式进行了总结. 并且自己去配了相应的测试脚本等. (部分内容是参考《高级Bash脚本编程指南.pdf》这本书上的内容) 所以从今天开始, 就写一写相关的内容, 希望对初学shell的同学起到一定的帮助吧. [基本赋值] $: 变量替换操作符 例如:

a=175
hello=$a
其中=的前后绝对不要有空格, 为什么?
1. hello =value  执行hello命令, 带有参数”=value”
2. hello= value  将hello赋值为””(空), 执行value命令
#! /bin/bash
a=175
hello=$a

hello =$a
hello= $a
上面这段代码会如何输出? ./test1.sh: line 5: hello: command not found ./test1.sh: line 6: 175: command not found  

The post shell变量之辨[1] appeared first on 邮递员大叔.

阅读全文>>

如何在thinkphp(sae版)中使用ueditor插件[3]

阅读全文

接下来算是比较重要的一点了吧, 在SAE平台上, 把上传图片神马的给用起来~~ 话说, 看了下1.2版本的UEditor, 发现比1.1.8版本多了挺好玩儿的功能啊~ 插入图片和插入视频这两个按钮, 里面都增加了一个"搜索"的功能, 搜索之后的结果选中了就可以直接插入编辑框中, 嗯, 这个还是挺赞的~ 其中视频搜索, 会自动解析视频的地址, 这个真心赞啊~ 废话不多说, 进入正式环节 1. 去除图片的"在线管理"功能. (这玩意儿功能是挺好的, 但是又得改程序, 又可能有权限之类的问题, 还是不开放给用户好啦) 找到dialogs/image/image.html, 删除以下代码:

<span tabSrc="imgManager">在线管理</span>
2. 修改图片上传的php文件, 还是在相同的文件中, 找到如下代码:
url:'../../server/upload/php/imageUp.php',
另外, 1.1.8的版本中, 是这样的:
url:'../../server/upload/php/up.php',
找到这个server目录中的imageUp.php文件进行修改. 找到之后发现同级目录下, 总共是有3个文件的, 分别是fileUp, imageUp, snapImageUp.(1.1.8只有up.php) , 这三个文件, 顾名思义, 分别是用来处理文件上传, 图片上传, 截图上传的~ 修改起来其实都比较类似, 我这儿还是只拿imageUp.php做个示例好了. 核心工作其实非常简单, 就是写一个新的php脚本, 用来替代原有的imageUp.php, 因为我是用的Thinkphp, 所以干脆直接把我的代码放出来吧 1) 修改以上的调用路径为:
url:'../../../../Pic/upload',
2) 写一个PicAction.class.php, 内容为:
<?php
class PicAction extends Action {
	public function upload()
	{
		//文件上传状态,当成功时返回SUCCESS,其余值将直接返回对应字符窜并显示在图片预览框,同时可以在前端页面通过回调函数获取对应字符窜
	    $state = "SUCCESS";

	    $title = htmlspecialchars($_POST['pictitle'], ENT_QUOTES);
	    $domain = C('PIC_UPLOAD_DOMAIN');
	    $path = C('PIC_UPLOAD_PATH');
	    $file = "";

	    //格式验证
	    $current_type = strtolower(strrchr($_FILES["picdata"]["name"], '.'));
	    if(!in_array($current_type, C('PIC_FILE_TYPE'))){
	        $state = "不支持的图片类型!";
	    }
	    //大小验证
	    $file_size = 1024 * C('PIC_FILE_SIZE');
	    if( $_FILES["picdata"]["size"] > $file_size ){
	        $state = "图片大小超出限制!";
	    }
	    //保存图片
	    if($state == "SUCCESS")
	    {
	    	$storage = new SaeStorage();
	    	$file = C('PIC_UPLOAD_PATH').uniqid().$current_type;
	    	$result = $storage->upload(C('PIC_UPLOAD_DOMAIN'),
	    		$file, $_FILES["picdata"]["tmp_name"]);
			if(!$result){
				$state = "图片保存失败!";
			}
			$file = $storage->getUrl($domain, $file);
	    }
		echo "{'url':'".$file."','title':'".$title."','state':'".$state."'}";
	}
}

?>
其中C('xx')这样的配置, 就根据自己的需要进行修改吧~这段代码还是比较容易理解的... 嗯哪, 这就ok了...(貌似关键的地方稍微简略了一点啊!!) 3. 唔, 经过再次尝试, 发现上面漏了一处~ 在1.2.0版本中的image.js, 或者是1.1.8版本中的image.html中, 找到如下代码:
tmpObj.data_ue_src = tmpObj.src = editor.options.imagePath + ci.url;
修改为:
tmpObj.data_ue_src = tmpObj.src = ci.url;
即, 针对storage中存储的图片, 直接使用返回的地址(即http://开头的绝对地址了) wordImage目录, 即word粘贴后的image处理, 与image处理类似, 不过第3步的时候, 修改的是如下代码:
img.src = editor.options.imagePath + url.url;
img.setAttribute("data_ue_src", editor.options.imagePath + url.url);  //同时修改"data_ue_src"属性
同理, 也是将+前面的imagePath那一坨去掉即可~~  

The post 如何在thinkphp(sae版)中使用ueditor插件[3] appeared first on 邮递员大叔.

阅读全文>>

如何在thinkphp(sae版)中使用ueditor插件[2]

阅读全文

接下来, 再对config进行一些修改. 1. 先是工具栏的配置, 以下是默认配置

//工具栏上的所有的功能按钮和下拉框,可以在new编辑器的实例时选择自己需要的从新定义
toolbars:[
    ['FullScreen', 'Source', '¦', 'Undo', 'Redo', '¦',
        'Bold', 'Italic', 'Underline', 'StrikeThrough', 'Superscript', 'Subscript', 'RemoveFormat', 'FormatMatch', '¦',
        'BlockQuote', '¦', 'PastePlain', '¦', 'ForeColor', 'BackColor', 'InsertOrderedList', 'InsertUnorderedList', '¦', 'CustomStyle',
        'Paragraph', 'RowSpacing', 'LineHeight', 'FontFamily', 'FontSize', '¦',
        'DirectionalityLtr', 'DirectionalityRtl', '¦', '', 'Indent', '¦',
        'JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyJustify', '¦',
        'Link', 'Unlink', 'Anchor', '¦', 'ImageNone', 'ImageLeft', 'ImageRight', 'ImageCenter', '¦', 'InsertImage', 'Emotion', 'InsertVideo', 'Map', 'GMap', 'InsertFrame', 'PageBreak', 'HighlightCode', '¦',
        'Horizontal', 'Date', 'Time', 'Spechars', '¦',
        'InsertTable', 'DeleteTable', 'InsertParagraphBeforeTable', 'InsertRow', 'DeleteRow', 'InsertCol', 'DeleteCol', 'MergeCells', 'MergeRight', 'MergeDown', 'SplittoCells', 'SplittoRows', 'SplittoCols', '¦',
        'SelectAll', 'ClearDoc', 'SearchReplace', 'Print', 'Preview', 'CheckImage', 'Help']
],
官方的说法是可以在new实例的时候传入配置, 但是我个人觉得这样在调用的时候还挺繁琐的. 倒是不如直接复制一个config文件, 在里面进行修改. 修改后直接在html代码里面嵌入这个config就成了~ 总之, 大家可以采用自己喜欢的方式啦. 我的时光邮局采用的配置是:
        toolbars:[
              ['Source', 'Undo', 'Redo', '¦',
              'Bold', 'Italic', 'Underline', 'StrikeThrough', 'Superscript', 'Subscript', 'RemoveFormat', 'FormatMatch',
              'PastePlain', '¦', 'ForeColor', 'BackColor', 'InsertOrderedList', 'InsertUnorderedList', '¦',
              'FontFamily', 'FontSize', '¦',
              '', '¦',
              'JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyJustify'],
              ['Link', 'Unlink', 'Anchor', '¦', 'InsertImage', 'CheckImage', 'Emotion', 'InsertVideo', 'Map', 'HighlightCode', '¦',
              'Horizontal', 'Date', 'Time', 'Spechars', '¦',
              'InsertTable', 'DeleteTable', 'InsertParagraphBeforeTable', 'InsertRow', 'DeleteRow', 'InsertCol', 'DeleteCol', 'MergeCells', 'SplittoCells', 'SplittoRows', 'SplittoCols',
              'SearchReplace', 'Print', 'Preview']
              ],
2. 接下来有一个很神奇的配置, zindex,
zIndex : 999, //编辑器z-index的基数
这个是什么呢, 根据它的名称, 就是一个div的z轴index, 再通俗点儿说, 这个值越大, 它越会被显示在上层. 刚开始的时候, 我的日期时间控件, 弹出的日期输入框, 发现竟然在ueditor的下面...于是我就把这个值修改小了(100), 于是就不会遮住日期输入框啦. 当然, 修改datetimepicker的zIndex也是一样的~ 3. 关闭远程图片抓取. 之前在1.1.8的版本中没有这个功能, 新版本增加了这个, 不过我个人感觉用处不大, 而且大大增加了改造的复杂度...所以干脆就关闭啦~
catchRemoteImageEnable:false,                                   //是否开启远程图片抓取
4. 修改表情包 我倒是没有新增表情包, 但是觉得自带的表情, 有些很磋..比如有啊表情之类...干脆删掉好了~我只保留了两个, 兔斯基&绿豆蛙 这个也比较简单, 修改dialog下面的emotion.js和emotion.html, 基本上就是一些数组啊神马的~另外emotion.css以及image底下的无用配置, 无用图片都可以直接删除了~ 除此之外, 在config中打开本地表情配置, 即
emotionLocalization:true, //是否开启表情本地化,默认关闭。若要开启请确保emotion文件夹下包含官网提供的images表情文件夹
emotion.js, emotion.html, emotion.css这三个文件我已经修改好, 可以直接下载zip包: emotion 5. 以上的方法会使用相对路径作为表情的路径, 实际上, 我们还可以利用sae的storage, 产生绝对路径的地址 1) 建立一个storage, 设为公有, 不过期, (可以根据需要去除防盗链功能). 将0.gif文件和ldw, tsj这两个文件夹上传到emotion目录中去. 这样的话, 表情的地址就是类似于: http://应用名称-Storage名称.stor.sinaapp.com/emotion/tsj/t_0001.gif 然后根据上面的zip包里面的内容, 做一些修改, 将emotion.js中emotion.SmileyPath修改为: http://应用名称-Storage名称.stor.sinaapp.com/emotion/ 即可~ 这样的话, 图片的表情地址就是http://开头的绝对路径啦~  好, 基础的配置也就到此结束啦, 下一篇文章再继续说说, 针对图片上传, 需要做怎样的修改~~ emotion.SmileyPath

The post 如何在thinkphp(sae版)中使用ueditor插件[2] appeared first on 邮递员大叔.

阅读全文>>

如何在thinkphp(sae版)中使用ueditor插件[1]

阅读全文

提到所见即所得编辑器, 许多人第一反应就是FckEditor, fck的确是一个非常赞的web在线编辑器, 功能非常强大, 定制性强(虽然我一直觉得它的界面十分丑陋...). 但是前段时间, 想为自己的"时光邮局"添加一个所见即所得编辑器, 想再用FckEditor, 惊讶地发现它被"拆"掉了. 基本的FckEditor(改名叫做CKEditor了)已经无法使用上传图片功能了, 这部分功能被放入另外一个插件CKFinder中去了. 虽然说, 通过配置, 还是可以把这两个玩意儿再组合起来, 但是看了下网上的教程, 貌似还是得花点儿功夫的. 而且我也不确定组合后的编辑器能够直接在SAE上使用.(SAE是不允许临时文件操作的, 需要通过Storage来管理文件) 如果说必须要修改, 我宁愿尝试一下新鲜的编辑器, 于是我最后选中了UEditor. ueditor(http://ueditor.baidu.com)是百度出品的一款所见即所得编辑器. 个人感觉功能还是很不错的, 在线的Demo试用了下, 觉得功能挺赞(和FckEditor挺像的), 另外不知道是不是CKEditor现在也有这个功能(真的好久没用了)----从Word粘贴, 粘贴后不仅能够尽可能地保留原有的格式, 更加有"word图片一键上传"功能, 即点一下粘贴之后不显示的图片, 直接选中一个本地的临时图片地址, 即可上传显示. 上传普通的图片也很方便. 自带的表情有兔斯基, 绿豆蛙等, 嗯, 符合中国国情啊! 好, 那就选中, 用百度的UEditor吧!(我当时使用的是1.1.8版本, 现在已经有1.2版本啦, 以下我以最新的版本为示例去讲吧~~) 这次先说它的最基本使用方式, 更多详情见http://ueditor.baidu.com/website/teach.html, 我这里先简单说明一下, 下一讲再重点说明如何和Thinkphp(sae版本)结合使用. (其实非thinkphp也类似, 只要用sae, 思路都是一样的) 1. 下载Ueditor压缩包, 放到工程目录中----这个我不需要教了吧. 对于Thinkphp, 我是选择放在根目录/版本号/Public目录下的~~ 2. 在需要使用的html/php/随便啥文件中, 先写入如下代码:

<script type="text/javascript" src="ueditor/editor_config.js"></script>
<script type="text/javascript" src="ueditor/editor_all.js"></script>
<link rel="stylesheet" href="ueditor/themes/default/ueditor.css"/>
官方说明中有这么一行, 需要注意: 需要注意的是,此处的editor_config.js最好先于editor_all.js加载,否则特定情况下可能会出现报错。 另外, 1) 推荐把editor_config.js复制一份出来, 作为备份. 在自己的config文件中修改~万一改坏了还有基础的备份可以参考 2) 压缩包中有editor_all.js和editor_all_min.js两个文件, 我们平时使用的时候, 使用前者即可. 后者是前者的"精简版", 去除了诸如换行, 空格之类, 更加利于网络传输, 但是不适合阅读. 因此推荐在最终发布的时候使用~~ 3. 如果是在Thinkphp框架中使用, 可以用以下的语句:
<load file="__ROOT__/Public/ueditor/editor_config.js" />
<load file="__ROOT__/Public/ueditor/editor_all.js" />

<load file="__ROOT__/Public/ueditor/themes/default/ueditor.css" />
4. 使用以下语句, 嵌入编辑器:
<div id="myEditor"></div>
<script type="text/javascript">
    var editor = new baidu.editor.ui.Editor();
    editor.render("myEditor");
</script>
其中myEditor, 换成自己所需要的id即可. 如果是编辑器初始化的时候有内容, 可以使用:
<script type="text/plain" id="myEditor">初始内容</script>
5. 重点需要配置config js文件中的以下代码:
    var tmp = window.location.pathname,
//            URL = window.UEDITOR_HOME_URL¦¦tmp.substr(0,tmp.lastIndexOf("\/")+1).replace("_examples/","").replace("website/","");//这里你可以配置成ueditor目录在您网站的相对路径或者绝对路径(指以http开头的绝对路径)
    URL = "../../../Public/ueditor/";
把URL设置为自己的ueditor所在的路径. 本来以为在Thinkphp中可以使用如"__ROOT__/Public/ueditor/"这样的形式的, 但是发现不行...没有被解析... 目前我用的还是这样的相对路径形式, 不过根据注释, 也可以写成http://开头的绝对形式.. 此处暂时没有仔细研究, 如果有好的方法, 请直接留言吧~~ 6. 在浏览器中打开编辑界面, 会发现UEditor已经可以正常工作了! (但是, 仅限于基础功能! 上传图片还是不可以的, 我在之后的文章中再讲~~) 如果在配置的过程中发生啥问题, 请直接去UEditor的官方网站查看教程吧:-) (NEW)7. 果然和1.1.8不一样了... 默认的value都是从editorValue这么一个post字段中去取, 而不是自己给定的那个ID...  

The post 如何在thinkphp(sae版)中使用ueditor插件[1] appeared first on 邮递员大叔.

阅读全文>>