-
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"
#!/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. ` `很容易与' '(单引号)搞混。有时在一些奇怪的字形显示中,两种符号是一模一样的(直竖两点)。
[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
会包含列表中的当前值
-
do
和done
语句之间输入的命令可以是一条或多条标准的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