shell变量里的字符替换
b=${a/123/321};将${a}里的第一个123替换为321
b=${a//123/321};将${a}里的所有123替换为321
b=${a//\//\\\/};将${a}里的所有/替换为\/
#shell调试:
sh -x aaa.sh b=${a/123/321};将${a}里的第一个123替换为321
b=${a//123/321};将${a}里的所有123替换为321
b=${a//\//\\\/};将${a}里的所有/替换为\/
#shell调试:
sh -x aaa.sh 平常在写shell脚本都是用$1,$2....这种方式来接收参数,然而这种接收参数的方式不但容易忘记且不易于理解和维护。Linux常用的命令都可指定参数名和参数值,然而我们怎样才能给自己的shell脚本也采用参数名和参数值这样的方式来获取参数值呢?而不是通过$1,$2这种方式进行获取。下面的例子定义了短参数名和长参数名两种获取参数值的方式。其实是根据getopt提供的特性进行整理而来。
#!/bin/sh
#说明
show_usage="args: [-l , -r , -b , -w]\
[--local-repository=, --repository-url=, --backup-dir=, --webdir=]"
#参数
# 本地仓库目录
opt_localrepo=""
# git仓库url
opt_url=""
# 备份目录
opt_backupdir=""
# web目录
opt_webdir=""
GETOPT_ARGS=`getopt -o l:r:b:w: -al local-repository:,repository-url:,backup-dir:,webdir: -- "$@"`
eval set -- "$GETOPT_ARGS"
#获取参数
while [ -n "$1" ]
do
case "$1" in
-l|--local-repository) opt_localrepo=$2; shift 2;;
-r|--repository-url) opt_url=$2; shift 2;;
-b|--backup-dir) opt_backupdir=$2; shift 2;;
-w|--webdir) opt_webdir=$2; shift 2;;
--) break ;;
*) echo $1,$2,$show_usage; break ;;
esac
done
if [[ -z $opt_localrepo || -z $opt_url || -z $opt_backupdir || -z $opt_webdir ]]; then
echo $show_usage
echo "opt_localrepo: $opt_localrepo , opt_url: $opt_url , opt_backupdir: $opt_backupdir , opt_webdir: $opt_webdir"
exit 0
fi 场景:手头的项目需要对外提供API服务,需要对请求数据进行签名校验。提交接口的数据会有''空字符值存在,laravel的Illuminate\Foundation\Http\Request接收到参数后,会将空字符强制转换为NULL,导致签名校验通不过。
经过一番努力,找到幕后黑手。
Illuminate/Foundation/Http组件中有定义这个中间件。
vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php
<?php
namespace Illuminate\Foundation\Http\Middleware;
class ConvertEmptyStringsToNull extends TransformsRequest
{
/**
* Transform the given value.
*
* @param string $key
* @param mixed $value
* @return mixed
*/
protected function transform($key, $value)
{
return is_string($value) && $value === '' ? null : $value;
}
}解决方法:
既然是中间件作祟,肯定在内核中有注册。找到内核注释该中间件就好。
app/Http/Kernel.php
class Kernel extends HttpKernel
{
/**
* The application's global HTTP middleware stack.
*
* These middleware are run during every request to your application.
*
* @var array
*/
protected $middleware = [
\App\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
//\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,//会将''转化为null
\App\Http\Middleware\TrustProxies::class,
\Illuminate\Session\Middleware\StartSession::class,
]; 主项目添加子模块:
git submodule add http://xxxx.gif dir
git submodule init
git submodule update
git commit -am 'add submodule'
git pushClone带有子模块的项目:
git clone --recursive http://xxx.git [path]
或者
git clone http://xxx.git [path]
git submodule init
git submodule update在主项目修改子模块:
cd submodule/path
git checkout master
git commit -am 'modify code'
git push origin master
cd main/path
git commit -am 'modify submodule commit id'
git push其它同事更新最新的子模块代码到他本地项目:
git pull
git status
#这里会拉取主项目更新,并显示子模块有改动,说明子模块与当前的代码不同了
#拉取子模块最新代码
git submoodule foreach git pull
#或者分别进入每个子模块目录,执行git pull,如下
cd submodule/path
git checkout master
git pull
#现在查看主项目状态,应该和其他最新的代码一致了
#cd main/path
git status
要在项目中移除子模块:
#删除git cache和物理文件夹
git rm -r --cached submodule/path/
rm -rf submodule/path/
#删除.gitmodules的这个子模块的内容
#删除.git/config的submodule相关配置
#查看状态,提交更改
git status
git commit -am 'delete submobule'
git push