[sh]脚本

  • mkdir是创造文件夹的命令。
  • || true 的意思是无论是否创建文件夹的命令执行成功都执行下一条命令,这么做的目的是因为,有时候因为已经有了目录导致目录创建不成功,这个时候执行下一条命令也可以正常执行。
  • set -e的目的是:当脚本执行出现意料之外的情况时,立即退出,避免错误被忽略,导致最终结果不正确。
  • touch是创建文件的命令。
#!/usr/bin/env sh
set  -e
NET_NAME=dense_res_blstm
ROOT_PATH=/ai/zhaoliang/7_caffe_ocr_for_linux/jiaqian_ocr/caffe_ocr_for_linux/examples/ocr/densenet
MODULES=$ROOT_PATH/modules_$NET_NAME
GPU=0

DATASET=/ai/zhaoliang/price_tag/val/

SOLVER=$ROOT_PATH/solver.prototxt
LOG=$MODULES/test_log.log
mkdir $MODULES || true

cd  $MODULES
touch $LOG
cd /ai/zhaoliang/7_caffe_ocr_for_linux/jiaqian_ocr/caffe_ocr_for_linux/.build_release/tools
./ocr_test $DATASET $MODULES  -gpu $GPU chi 2>&1   | tee $LOG
  • >$LOG 2>&1 含义是将标准错误输出和输出都写入log文件里面 ,|的意思是管道,就是将上一个程序的输出当做下一个程序的输入,tee从标准输入中读取,并将读入的内容写到标准输出以及文件中。这里tee命令的作用是将数据读入并写到标准输出以及log.txt中。
#!/usr/bin/env sh
set -e
NET_NAME=dense_res_blstm
ROOT_PATH=/ai/zhaoliang/7_caffe_ocr_for_linux/jiaqian_ocr/caffe_ocr_for_linux/examples/ocr/densenet


MODULES=$ROOT_PATH/modules_$NET_NAME
LOG=$MODULES/train_log.log
SOLVER=$ROOT_PATH/solver.prototxt
GPU=1

mkdir $MODULES ||true
cd  $MODULES
touch $LOG


cd /ai/zhaoliang/7_caffe_ocr_for_linux/jiaqian_ocr/caffe_ocr_for_linux/.build_release/tools
./caffe train --solver=$SOLVER -gpu $GPU  2>&1 | tee $LOG $@
  • 外部调用的时候只用bash transformer.sh train 就行了。
  • 值得注意的是${@:2}这个意思是$@是获取所有的传入参数(不包括脚本名),其实这个开可以加上两个参数就是${@:start:number}表示从第几个参数开始的number个参数。那个这个用途就是将在这个脚本中没有用--写的参数可以通过执行.sh脚本的时候通过命令行传入到Python程序train.py中,就是从第二个个参数开始以后的所有参数传递进来。
#!/bin/ksh
echo "$@"

# 则执行 a.sh 1 2 3 4 ,你会得到
>>> 1 2 3 4 

#!/bin/bash

if [[ $1 == 'train' ]]; then
    echo 'Run training...'
    python train.py \
        --cuda \
        --data ../data/enwik8/ \
        --dataset enwik8 \
        --n_layer 12 \
        --d_model 512 \
        --n_head 8 \
        --d_head 64 \
        --d_inner 2048 \
        --dropout 0.1 \
        --dropatt 0.0 \
        --optim adam \
        --lr 0.00025 \
        --warmup_step 0 \
        --max_step 400000 \
        --tgt_len 512 \
        --mem_len 512 \
        --eval_tgt_len 128 \
        --batch_size 22 \
        --multi_gpu \
        --gpu0_bsz 4 \
        ${@:2}
elif [[ $1 == 'eval' ]]; then
    echo 'Run evaluation...'
    python eval.py \
        --cuda \
        --data ../data/enwik8/ \
        --dataset enwik8 \
        --tgt_len 80 \
        --mem_len 2100 \
        --clamp_len 820 \
        --same_length \
        --split test \
        ${@:2}
else
    echo 'unknown argment 1'
fi
  • 设置默认值意思是GPU使用第二个参数,如果没有第二个参数那么使用默认值3
    ${参数编号:-默认值}
export CUDA_VISIBLE_DEVICES=${2:-3}
  • 获取参数的总数$#
  • 获取最后一个参数${!#}(本来应该是${$#},但是方括号里面不能有$符号因此用!代替)
  • 如果用户没有输入num的值,那么先提示一下,如果用户按了回车那么设置一个默认值10
#!/bin/bash
read  -p "请输入一个数:" num
if [ -z "${num}" ];then
    num=10
fi
echo "num is  $num"
  • 等待5秒如果没有输入值那么设置默认值10
#!/bin/bash
read -t 5 -p "请输入一个数:" num
num=${num:-10}
echo "num=$num"
  • shell脚本执行的结果写进文档log文件里面。执行脚本script.sh时将错误输出2以及标准输出1都一起以附加写方式导入logfile文件。即使多次执行脚本,之前的log也仍然存在。
./script.sh >>logfile 2>&1
  • 一个脚本
#!/usr/bin/env sh

FLAG=baseline
TRANS=envi

PROBLEM=translate_${TRANS}_iwslt32k
MODEL=lstm_seq2seq_attention
HPARAMS=lstm_luong_attention
ROOT_DIR=/home/zhaoliang/t2t_xiang
DATA_DIR=$ROOT_DIR/t2t_data
TMP_DIR=$ROOT_DIR/t2t_datagen
TEST_FILE=$ROOT_DIR/t2t_datagen/tst2013.en
TEST_FILE_PHRASE=$ROOT_DIR/t2t_datagen/phrase_replaced_sentence.test.lang1
TEST_FILE_GARMMAR=$ROOT_DIR/t2t_datagen/garmmar.test
TEST_REFE=$ROOT_DIR/t2t_datagen/tst2013.vi
TRAIN_DIR=$ROOT_DIR/t2t_train/$PROBLEM/$MODEL-$HPARAMS-$FLAG
AVG_DIR=$ROOT_DIR/t2t_avg/$PROBLEM/$MODEL-$HPARAMS-$FLAG
RESULT_FILE=$ROOT_DIR/$TRANS-$MODEL.test.result

CHECKPOINT_PATH=$TRAIN_DIR/model.ckpt-30000
TRAIN_STEP=30000
EVAL_STEP=500
BEAM_SIZE=4
ALPHA=0.6

export CUDA_VISIBLE_DEVICES=${2:-2}

touch $RESULT_FILE
mkdir -p $DATA_DIR $TMP_DIR $TRAIN_DIR

if [[ $1 == 'datagen' ]]; then
    # Generate data
    python3 t2t-datagen \
        --data_dir=$DATA_DIR \
        --tmp_dir=$TMP_DIR \
        --problem=$PROBLEM
        
elif [[ $1 == 'train' ]]; then
    # Train
    # *  If you run out of memory, add --hparams='batch_size=1024'.
    python3 t2t-trainer \
        --data_dir=$DATA_DIR \
        --problem=$PROBLEM \
        --model=$MODEL \
        --hparams_set=$HPARAMS \
        --train_steps=$TRAIN_STEP \
        --eval_steps=$EVAL_STEP \
        --output_dir=$TRAIN_DIR \
        --hparams='batch_size=20480' \
        --eval_throttle_seconds=100

elif [[ $1 == 'avg' ]]; then
    python3 t2t-avg-all \
        --model_dir=$TRAIN_DIR \
        --output_dir=$AVG_DIR

elif [[ $1 == 'test' ]]; then
    # Decode
    
    python3 t2t-decoder \
        --data_dir=$DATA_DIR \
        --problem=$PROBLEM \
        --model=$MODEL \
        --hparams_set=$HPARAMS \
        --checkpoint_path=$CHECKPOINT_PATH \
        --decode_hparams="beam_size=$BEAM_SIZE,alpha=$ALPHA" \
        --decode_from_file=$TEST_FILE \
        --decode_to_file=$PROBLEM-$MODEL-$HPARAMS.original
        # See the translations
        # cat translation.en
        # Evaluate the BLEU score
        # Note: Report this BLEU score in papers, not the internal approx_bleu metric.
    python3 t2t-bleu \
        --translation=$PROBLEM-$MODEL-$HPARAMS.original \
        --reference=$TEST_REFE
elif [[ $1 == 'test_phrase' ]]; then
    # Decode
    python3 t2t-decoder \
        --data_dir=$DATA_DIR \
        --problem=$PROBLEM \
        --model=$MODEL \
        --hparams_set=$HPARAMS \
        --output_dir=$AVG_DIR \
        --checkpoint_path=$CHECKPOINT_PATH \
        --decode_hparams="beam_size=$BEAM_SIZE,alpha=$ALPHA" \
        --decode_from_file=$TEST_FILE_PHRASE \
        --decode_to_file=$PROBLEM-$MODEL-$HPARAMS.phrase
        # See the translations
        # cat translation.en

        # Evaluate the BLEU score
        # Note: Report this BLEU score in papers, not the internal approx_bleu metric.
    python3 t2t-bleu \
        --translation=$PROBLEM-$MODEL-$HPARAMS.phrase \
        --reference=$TEST_REFE

elif [[ $1 == 'test_garmmar' ]]; then
    # Decode
    python3 t2t-decoder \
        --data_dir=$DATA_DIR \
        --problem=$PROBLEM \
        --model=$MODEL \
        --hparams_set=$HPARAMS \
        --output_dir=$AVG_DIR \
        --checkpoint_path=$CHECKPOINT_PATH \
        --decode_hparams="beam_size=$BEAM_SIZE,alpha=$ALPHA" \
        --decode_from_file=$TEST_FILE_GARMMAR \
        --decode_to_file=$PROBLEM-$MODEL-$HPARAMS.garmmar
        # See the translations
        # cat translation.en
        # Evaluate the BLEU score
        # Note: Report this BLEU score in papers, not the internal approx_bleu metric.
    python3 t2t-bleu \
        --translation=$PROBLEM-$MODEL-$HPARAMS.garmmar \
        --reference=$TEST_REFE
elif [[ $1 == 'test_all' ]]; then

    echo 'test original bleu: ' >> $RESULT_FILE
    # Decode orginal 
    python3 t2t-decoder \
        --data_dir=$DATA_DIR \
        --problem=$PROBLEM \
        --model=$MODEL \
        --hparams_set=$HPARAMS \
        --checkpoint_path=$CHECKPOINT_PATH \
        --decode_hparams="beam_size=$BEAM_SIZE,alpha=$ALPHA" \
        --decode_from_file=$TEST_FILE \
        --decode_to_file=$PROBLEM-$MODEL-$HPARAMS.original
        # See the translations
        # cat translation.en
        # Evaluate the BLEU score
        # Note: Report this BLEU score in papers, not the internal approx_bleu metric.
    python3 t2t-bleu \
        --translation=$PROBLEM-$MODEL-$HPARAMS.original \
        --reference=$TEST_REFE  >> $RESULT_FILE 

    echo 'test phrase bleu: ' >> $RESULT_FILE
    # Decode phrase
    python3 t2t-decoder \
        --data_dir=$DATA_DIR \
        --problem=$PROBLEM \
        --model=$MODEL \
        --hparams_set=$HPARAMS \
        --output_dir=$AVG_DIR \
        --checkpoint_path=$CHECKPOINT_PATH \
        --decode_hparams="beam_size=$BEAM_SIZE,alpha=$ALPHA" \
        --decode_from_file=$TEST_FILE_PHRASE \
        --decode_to_file=$PROBLEM-$MODEL-$HPARAMS.phrase
        # See the translations
        # cat translation.en

        # Evaluate the BLEU score
        # Note: Report this BLEU score in papers, not the internal approx_bleu metric.
    python3 t2t-bleu \
        --translation=$PROBLEM-$MODEL-$HPARAMS.phrase \
        --reference=$TEST_REFE >> $RESULT_FILE 

    echo 'test garmmar bleu: ' >> $RESULT_FILE
    # Decode garmmar
    python3 t2t-decoder \
        --data_dir=$DATA_DIR \
        --problem=$PROBLEM \
        --model=$MODEL \
        --hparams_set=$HPARAMS \
        --output_dir=$AVG_DIR \
        --checkpoint_path=$CHECKPOINT_PATH \
        --decode_hparams="beam_size=$BEAM_SIZE,alpha=$ALPHA" \
        --decode_from_file=$TEST_FILE_GARMMAR \
        --decode_to_file=$PROBLEM-$MODEL-$HPARAMS.garmmar
        # See the translations
        # cat translation.en
        # Evaluate the BLEU score
        # Note: Report this BLEU score in papers, not the internal approx_bleu metric.
    python3 t2t-bleu \
        --translation=$PROBLEM-$MODEL-$HPARAMS.garmmar \
        --reference=$TEST_REFE >> $RESULT_FILE 
else
    echo 'unknown argment 1'
fi
  • 如果mosesdecoder这个目录不存在那么就下载,-d是判断是否是目录。
if [ ! -d "mosesdecoder" ]; then
  git clone ${MOSES_GIT_URL}
fi
  • $()的作用就是进行命令重组,就是先执行$()里面的命令,然后将其输出作为输入再执行第二个命令。
# echo `which who`
# echo $(which who)
他们得到的结果都是相同的

用$( )的理由
1. ` `很容易与' '(单引号)搞混。有时在一些奇怪的字形显示中,两种符号是一模一样的(直竖两点)。
  • data命令,date "+%Y-%m-%d"
[root@localhost ~]# echo today is $(date "+%Y-%m-%d")
today is 2017-11-07
[root@localhost ~]# echo today is `date "+%Y-%m-%d"`
today is 2017-11-07
  • >>>的区别,前者是覆盖,后者是追加。
  • | log.txt| tee log.txt的区别和联系,管道都是直接把缓冲区的内存地址给下一个文件,因此十分的高效,但是这两个的区别在于后面的tee命令会同时将数据输出到控制台中,而前者只是将数据写到文件里面,如果想使用tee命令追加的话tee -a

for 语句

for var in list
do
    commands
done
  • list参数:迭代中要用的一系列值
  • 每个迭代中,变量var会包含列表中的当前值
  • dodone语句之间输入的命令可以是一条或多条标准的bash shell命令
#!/bin/bash
 
for test in I don't know if "this'll" work
do
    echo "word:$test"
done
$./test
word:I
word:don't
  • for循环假定每个值都是用空格,\t,和\n分割的,因此可以将这些值用双引号圈起来如 "New York"
  • for循环还可以自动遍历满是文件的目录。
...
for file in /home/rich/test/*
do
    if [ -d "$file" ]
    then
        echo "$file is a directory"
    elif [ -f第12章:更多结构化命令
第6章:理解Linux文件权限.md "$file" ]  
    then
        echo "$file is a file"
    fi
done
  • Linux中,目录名和文件名中包含空格是合法的,要容纳这种值,应该将$file变量用双括号圈起来,其实如果任何元素里面有空格,那么就要用这种形式"$file"包裹起来,下面的例子是将文件的方式和列表的方式相结合。
for file in /home/rich/.b* /home/rich/badtest
do
    if [ -d "$file" ]
    then
        echo "$file is a directory"
    elif [ -f "$file" ]  
    then
        echo "$file is a file"
    else
        echo "$file doesn't exist"
    fi
done
  • 遍历参数列表
for arg in $*; do
  echo $arg
done
  • 中间有seq命令,注意不是单引号而是esc下面的那个斜杠号,用markdown的都懂
for i in `seq 1 100`
do 
  echo $i
done 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351