文章目录
1. 基础
1.1 运行
- bash filename
- sh filename
这两种方式都不需要文件有可执行性 - ./filename要求文件是可执行脚本
1.2 注释
- 单行注释
# coding
- 多行注释
:<<EOF
COING
EOF
2.变量
- 定义变量—变量名和等号之间不能有空格
your_name=“runoob.com” - 对于已经定义过变量的引用----在变量名前面加美元符号即可
echo $your_name
echo ${your_name} 变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界 - 除了显式的赋值,还可以用语句赋值
for file inls /etc
或
for file in $(ls /etc)
- 判断输入变量个数
if [ $# != 3 ] ; then
echo "USAGE: $0 from to"
echo " e.g.: $0 ~/oucaijun/from ~/oucaijun/to"
exit 1;
fi
- str类型的参数报错
text="happy new year"
bash run.sh --text "$text" #这样就可以了
地址
current_working_dir = $pwd
## 取$current_working_dir的上三级目录
merlin_dir=$(dirname $(dirname $(dirname $current_working_dir)))
- 只要文件名:该命令的作用是去掉变量var从左边算起的最后一个’/‘字符及其左边的内容,返回从左边算起的最后一个’/'(不含该字符)的右边的内容。
var=/home/zhangying13/.jupyter/experiments-train/autovc/adaptive_voice_conversion/tools/librosa_wav2mfcc
file=${var##*/}
echo $file
3.字符串
字符串格式
- 单引号字符串
str='this is a string'
单引号字符串中不能有变量,单引号必须成对出现
- 双引号字符串
your_name='runoob'
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str
双引号字符串中可以出现变量
- 还可以对字符串进行拼接、查找、长度等操作
http://www.runoob.com/linux/linux-shell-variable.html
替换操作
a='01.npy'
b=${a//.npy/.dat} ---------双划线,将所有的.npy都替换成.dat,注意是大括号
b=${a/.npy/.dat} ---------单划线,将第一个的.npy都替换成.dat,注意是大括号
echo $b
01.dat
4. 数组
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开
array_name=(value0 value1 value2 value3)
读取数组元素值 valuen=${array_name[n]}
5.流程控制
在shell文本中,如果一个流程没有执行命令,就不要写,java等语言是可以空着的,shell不可以
- if-else命令
if开头,一定要用fi结尾
a=10
b=20
if [ $a == $b ]
then
echo "a 等于 b"
elif [ $a -gt $b ]
then
echo "a 大于 b"
elif [ $a -lt $b ]
then
echo "a 小于 b"
else
echo "没有符合的条件"
fi
- for 循环命令
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
- wihle循环
while condition
do
command
done
- 此外,还有util ,continue,case,break等命令可用
http://www.runoob.com/linux/linux-shell-process-control.html
5. test命令
Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试,针对不同对象的测试,命令有所区别。
http://www.runoob.com/linux/linux-shell-test.html
num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo '两个数相等!'
else
echo '两个数不相等!'
fi
6. 比较运算符
7.text
7.1 写出到text
> 写出到文件,若文件不存在,则创建
==>>==追加写到文件
echo "######################################" > $global_config_file
echo "############# PATHS ##################" >> $global_config_file # 追加写
printf "test_001\ntest_002\ntest_003" > ${synthesis_dir}/test_id_list.scp
8. source
用法:source filename
作用:在当前bash环境下读取并执行FileName中的命令,包括变量赋值等
该命令通常用命令“.”来替代。. filename
8.1 source filename 与 sh filename 及./filename执行脚本的区别
- 当shell脚本具有可执行权限时,用sh filename与./filename执行脚本是没有区别得。./filename是因为当前目录没有在PATH中,所有”.”是用来表示当前目录的。
- sh filename 重新建立一个子shell,在子shell中执行脚本里面的语句,该子shell继承父shell的环境变量,但子shell新建的、改变的变量不会被带回父shell。
- source filename:这个命令其实只是简单地读取脚本里面的语句依次在当前shell里面执行,没有建立新的子shell。那么脚本里面所有新建、改变变量的语句都会保存在当前shell里面。
9. for 循环
- 列表循环
array = ('wav32k' 'speed32k' 'energy32k') ---列表定义
for name32 in ${array[@]} ---循环遍历
do
xxx
done
- 字典循环
### 首先声明字典
declare -A dic
dic=(['en16k']='en' ['sp16k']='speed' ['src']='ori')
for key in $(echo ${!dic[*]})
do
echo $key : ${dic[$key]}
done
四则运算
- 区分整数和浮点数
- 运算符号前后要有空格
整形运算
方法1:
b=$((5*5+5-3/2))
echo $b
29
方法2:
用:expr 实现运算
expr 5 - 4
1
浮点预算
bash 不支持浮点运算,如果需要进行浮点运算,需要借助bc,awk 处理。
方法一:
c=$(echo "5.01-4*2.0"|bc)
echo $c
- 2.99
方法二:
c=$(awk 'BEGIN{print 7.01*5-4.01 }')
echo $c
- 31.04
加减运算
- 要用expr把运算的公式包起来,中间空格不能少
stage=1
stage=`expr $stage + 1`