平常在写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的IlluminateFoundationHttpRequest接收到参数后,会将空字符强制转换为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,
    ];

转载于:https://blog.51cto.com/phpme/2373853

主项目添加子模块:

git submodule add http://xxxx.gif dir
git submodule init
git submodule update
git commit -am 'add submodule'
git push

Clone带有子模块的项目:

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