Shell 基础

shell 基础

在终端输入:sh进入脚本界面

helloworld

编辑内容


#!/bin/bash

echo "hello world!"

保存退出:

w ~/helloworld.sh

运行:


chmod +x ~/helloworld.sh

cd ~

./helloworld.sh

执行结果:

hello world!

分析:

第一行中#!是一个约定的标记,告诉系统脚本需要使用什么解释器来执行,即使用哪一种shell

这种在第一行指定了解释器信息的方式,需要让脚本作为可执行程序执行

还有第二种运行方式,即作为解释器参数,这时,第一行的解释器信息,失效

eg:python test.py

shell 变量

显式赋值:

a="abc"

用语句:


for file in `ls /etc/` 

或者

for file in $(ls /etc)

使用变量:

使用一个定义过的变量:


file="test"

echo $file

echo ${file}

花括弧是为了帮助解释器识别变量的边界:


for skill in Ada Coffe Action java;do

	echo "I am good at ${skill}Script"

done

只读变量

使用readonly :


#!/bin/bash

myUrl='http://euraxluo.github.io'

readonly myUrl

删除变量

unset:

unset variable_name

变量被删除后不能再次使用,unset 命令不能删除只读变量


#!/bin/sh

myUrl="http://euraxluo.github.io"

myname="Euraxluo"

readonle myname

unset myname

unset myUrl

echo $myUrl

echo $myname

字符串:

单引号

单引号字符串的限制:

单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;

单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

str='this is a string'

双引号

双引号的优点:

双引号里可以有变量

双引号里可以出现转义字符


your_name='euraxluo'

str="Hello, I know you are \"$your_name\"! \n"

echo -e $str

拼接字符串


mynam="euraxluo"

str1="hello "word" ! from "$myname

str2="hello word ! from $myname"

echo $str1

echo $str2

str1='hello 'word' ! from '$myname

str2='hello word ! from $myname'

echo $str1

echo $str2

获取字符串长度

在变量名前加#


string="abc"

echo ${#string}

提取子字符串

截取字符变量的前5位

expr substr “$a” 1 8

echo $a|cut -c1-8


string="hello world euraxluo"

#1

echo `expr substr "$string" 1 5`

#2

echo $string | cut -c1-5

按指定的字符串截取

从左向右截取最后一个string后的字符串

${varible##*string}

从左向右截取第一个string后的字符串

${varible#*string}

从右向左截取最后一个string后的字符串

${varible%%string*}

从右向左截取第一个string后的字符串

${varible%string*}

“*”只是一个通配符可以不要


string="hello world euraxluo"

#1

echo ${string##*ld}

#2

echo ${string#*l}

#3

echo ${string%%w*}

#4

echo ${string%wo*}

查找子字符串

查找r u 的位置:


string="hello world euraxluo"

echo `expr index "$string" ru`

shell数组

bash支持一维数组(不支持多维数组),并且没有限定数组的大小

定义数组

数组名=(值1 值2 ... 值n)

eg:


values=(

value1 value2 value3

)

echo $values

echo ${value[1]}

读取数组

通过下标读取

${数组名[下标]}

读取全部元素

echo ${数组名[@]}

获取数组的长度


# 取得数组元素的个数

length=${#array_name[@]}

# 或者

length=${#array_name[*]}

# 取得数组单个元素的长度

lengthn=${#array_name[n]}

注释:

单行注释:

在每行开头加上#

多行注释:

1:


每一行加个#符号太费力了,可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。

2:


:<<EOF

注释内容...

注释内容...

注释内容...

EOF

或者


:<<'

注释内容...

注释内容...

注释内容...

'

自动复制脚本


#!/bin/sh

#	`find /home/euraxluo/Documents/工作报告/bags -mmin +1240 -exec rm -f () \;` 这是删除21h前的

#	df 查看硬盘地址,我的是/run/media/euraxluo/72c7944d-f7e1-4cb9-a431-6b0285044d79/

#	/home/euraxluo/Documents/工作报告/bags 是我的 bag存放地址

if [ ! -d "/run/media/euraxluo/72c7944d-f7e1-4cb9-a431-6b0285044d79" ];then

	echo "硬盘还没插"

else

	echo "删除一天前拷贝过来的文件"

	`find /home/euraxluo/Documents/工作报告/bags -mtime 1 -exec rm -f {} \;`

	echo "硬盘插入,自动拷贝中!"

	for var in `cd /run/media/euraxluo/72c7944d-f7e1-4cb9-a431-6b0285044d79/ && ls *.bag`

	do 

		strcp="cd /run/media/euraxluo/72c7944d-f7e1-4cb9-a431-6b0285044d79/ && cp -i $var /home/euraxluo/Documents/工作报告/bags/${var##*/}"

		`awk "BEGIN { cmd=\"$strcp\"; print "n" | cmd; }"`

	done

	echo "拷贝完成"

	`cd /home/euraxluo/Documents/工作报告/bags`

fi

批量修改文件后缀的shell


#!/bin/bash

# -*- coding: UTF-8 -*-

oldext="apng"

newext="png"

dir=$(eval pwd)

for file in $(ls $dir | grep .$oldext)

        do

        name=$(ls $file | cut -d. -f1)

        mv $file ${name}.$newext

        done

echo "change apng=====>png done!"

CC BY-NC 4.0

Shell 进阶
ROS基础学习2

Comments