bash shell 编程

版权声明:所有文章都是自己编写整理,可以转载分享。--Zen in Zen https://blog.csdn.net/weixin_32393347/article/details/85650827

bash shell

1.批量修改文件名称

#! /bin/bash
for file in ./labels/full/*.lab
do
name=${file%.lab}
new=${name}1.lab
echo $file $new
mv $file $new
echo "$file ====> $new"
done

2.wav2raw

#!/bin/bash
for wav in ./wav/*.wav
do
raw=./raw/`basename $wav .wav`.raw
echo $raw
/usr/local/bin/Wav2raw -d pathdir  $wav
done

3.raw2wav

#!/bin/bash
for wav in ./wav/*.wav
do
raw=./raw/`basename $wav .wav`.raw
echo $raw
/usr/local/bin/raw2wav -d 文件夹 -s 48000 $wav
done

2018年12月13日 下午4:50

shell中的特殊变量

$0 当前脚本的文件名称
$n 传递给脚本或者函数的参数 ,n是一个数字表示第几个参数
$# 传递给函数或者脚本的参数个数
$* 传递给函数或者脚本的所有参数
$@ 传递给脚本或者参数的所有参数
$? 上个命令的退出状态,或者函数的返回值
$$ 当前shell的进程ID,对于shell脚本就是所有脚本所在的ID

基础命令

  • man+命令:查阅命令的手册
  • man + k +命令:查阅命令手册
  • linux下的通配符:?代表一个字符;×代表0个或者多个字符;
  • touch 文件名 #创建新文件
  • rm -i 文件 #判断是否删除
  • cat filename #文件名字
  • more /etc/bash.bashrc #
  • ps -ef #查看进程
  • killall 进程名字
  • history #查看历史命令
  • print env #打印当前的环境变量
  • date > test6 #重新定向输出
  • mkdir -p 多级文件夹
  • source filename
    • 简单的把文件的语句依次在当前的shell执行,没有新建立子shell。那么脚本里面的所有新建或者改变的环境变量都在当前的shell里面。
    • source filename = . filename
    • sh filename 与./filename 有执行权限的时候是没有区别的。

sed 文本流编辑器

sed是一个“非交互式的”面向字符流的编辑器。

sed [option] 'sed command'filename
sed [option] -f 'sed script'filename
-n :只打印模式匹配的行
-e :直接在命令行模式上进行sed动作编辑,此为默认选项
-f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作
-r :支持扩展表达式
-i :直接修改文件内容

sed的编辑命令(sed command):
p:打印匹配行(和-n选项一起合用)

=:显示文件行号

a\ :在定位行号后附加新文本信息

i\ :在定位行号后插入新文本信息

d :删除定位行

c\ :用新文本替换定位文本

w filename :写文本到一个文件,类似输出重定向 >

r filename :从另一个文件中读文本,类似输入重定向 <

s :使用替换模式替换相应模式

q :第一个模式匹配完成后退出或立即退出

l :显示与八进制ACSII代码等价的控制符

{} :在定位行执行的命令组,用分号隔开

n :从另一个文件中读文本下一行,并从下一条命令而不是第一条命令开始对其的处理

N :在数据流中添加下一行以创建用于处理的多行组

g :将模式2粘贴到/pattern n/

y :传送字符,替换单个字符
  • sed -n “2p” filename #打印文本文件filename中的第二行并显示出来
  • sed -n “/keywords/p” filename #打印filename中的含有keywords的行
  • sed -n “1,3p” filename #打印filename中的第一行到第3行
  • sed -n “/keyword1/,/keyword2/p” filename #打印filename中keyword1和keyword2之间的行
  • sed -n “/#/!{/$/!p}” filename #打印filename中除去#开头和空格的行
  • sed -e “/^#/d” -e “/^$/d” filename #删除已空格或#开头的行
  • sed -i “/keyword/s/^/keywords1 /” filenaem # filename在keyword关键的行添加keyword1
  • sed -e “s/keyword/keyword1 &/” filename #在filename文件的keyword前添加keyword1
  • sed -e “s/keyword/& keyword1/” filename #在filename文件的keyword后添加keyword1

shell 编程

1.权限问题
在创建test1文件时, umask 的值决定了新文件的默认权限设置。由于 umask 变量在Ubuntu中被设成了 022 (参见第7章),所以系统创建的文件只有文件属主和属组才有读/写权限。
$ chmod u+x test1

#!/bin/shell
who
date
name = "yanerle"
echo "打印内容: $name"
# 两种方式将linux的输出给新的变量
# 方法一
datetime = 'date'
# 方法二
datetime = $(date)
exit

  • 外部命令,有时候也被称为文件系统命令,是存在于bash shell之外的程序。它们并不是shell程序的一部分。外部命令程序通常位于/bin、/usr/bin、/sbin或/usr/sbin中

bash 循环命令

  1. 循环语句
# if command1 成功 才会运行command2
if command1
then command2
fi


if command1;then
command2
command3
command4
fi

  1. if then esle
# if 语句返回是非零的数据,则执行else语句
if [command] then
commands
else
commands
fi

if [command] then 条件句子类型

-e filename #如果文件存在,返回真
-d filename # filename 为文件夹,返回真
-f filename # filename为常规文件,返回真
-L filename #filename为符号链接,返回真
-r filename #filename可读,则为真
-w filename # filename 可写,返回真
-x filename #filename 可执行,返回真

字符串比较运算符
-z string #长度为0,返回真
-n string #长度非零,返回真
string1 = string2 #如果两个字符完全相同,则为真
string1 != string2 #两个字符串不同,则为真。

算数比较
num1 -eq num2 等于
num1 -ne num2 不等于
num1 -lt num2 小于
num1 -gt num2 大于
num1 -le num2 小于等于
num1 -ge num2 大于等于

3.if 嵌套

if command1 
then
commands 
elif command2
then
more commands 
fi

3.test

if [ condition ] #方括号定义了测试条件。注意,第一个方括号之后和第二个方括号之前必须加上一个空格,
否则就会报错。
then
commands
fi

tips:test 判断可以是三类条件:数值比较、字符比较、文件比较

test命令数值比较

[[ $str1 = $str2 ]] #str1等于str2时返回真,str1和str2包含的文本一模一样
[[ $str1 == $str2 ]] #检查字符串是否相同的写法
[[ $str1 != $str2 ]] #如果str1和str2不同,返回真
[[ $str1 > $str2 ]]
[[ $str1 < $str2 ]]

执行脚本的命令

- bash myscript.sh
- chmod a+x sample.sh #赋予命令执行的权限
- ./myscript.sh
- #获得变量的字符串的长度 ${#var}
- $SHELL #查看当前的shell版本


判断是否是超级用户权限

#!/bin/bash
#文件名
If [ $UID -ne 0 ];then
    echo "NO root,please root"
else
    echo Root user
fi

使用let直接执行基本的算术运算

let a = b + c #let 可以执行基本的算术运算
或者
a = $[ b + c ]
echo "hello world">text.txt  #添加
echo "hello world">> text.text #追加

shell array

array_test = (test1 test2 test3)
or 
array_test[0]="test1"
array_test[1]="test2"
array_test[2]="test3"

重复执行直到成功

repeat()
{
    while true
    do
        $@ && return
    done
}

cat 命令

cat -s file   #删除文件中的空格显示

find 命令

find . -print
find /home/slynux -name '*.txt' -print


文件文本的交集和差集

sort file1.txt -o file1.txt;sort file2.txt -o file2.txt
comm file1.txt file2.txt
for files in `ls`
do
    echo $files
    echo nan $files > stdout

done

调试

  • 断点调试,gdb调试(C、C++)
  • Python命令行调试(Python pdb):python3 -m pdb test.py #m=model
  • pdb:l #显示当前运行到的部位
  • pdb:n #接下来要执行的代码
  • pdb:c # 继续执行剩下的全部
  • pdb:b 行数 #设置断点
  • pdb:b # 执行当前情况下的设置的断点列表
  • pdb:clear 断点序号 #设置的断点序号
  • pdb: p 变量数 #打印当前变量的值
  • pdb:a 形参变量 #打印当前的变量
  • pdb:s 进入到函数内部
  • pdb:q #退出调试
  • pdb:r #快速执行到函数的最后一行

猜你喜欢

转载自blog.csdn.net/weixin_32393347/article/details/85650827