shell脚本

1. 基础

1.1 运行
  1. bash filename
  2. sh filename
    这两种方式都不需要文件有可执行性
  3. ./filename要求文件是可执行脚本
1.2 注释
  1. 单行注释 # coding
  2. 多行注释
:<<EOF
COING
EOF

2.变量

  1. 定义变量—变量名和等号之间不能有空格
    your_name=“runoob.com”
  2. 对于已经定义过变量的引用----在变量名前面加美元符号即可
    echo $your_name
    echo ${your_name} 变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界
  3. 除了显式的赋值,还可以用语句赋值
    for file in ls /etc

    for file in $(ls /etc)
    在这里插入图片描述
  4. 判断输入变量个数

if [ $# != 3 ] ; then
echo "USAGE: $0 from to"
echo " e.g.: $0 ~/oucaijun/from ~/oucaijun/to"
exit 1;
fi
  1. 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.字符串

字符串格式
  1. 单引号字符串
str='this is a string'

单引号字符串中不能有变量,单引号必须成对出现

  1. 双引号字符串
your_name='runoob'
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str

双引号字符串中可以出现变量

  1. 还可以对字符串进行拼接、查找、长度等操作

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不可以

  1. 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
  1. for 循环命令
for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done
  1. wihle循环
while condition
do
    command
done
  1. 此外,还有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`

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值