Linux之shell脚本

shell基本命令

$变量名:使用变量的值,当解释器需要识别变量的边界时可以给变量加上{}
readonly 变量名:把变量定义为只读变量
unset 变量名:删除变量,但是不能删除只读的变量
read [选项] 变量名:读取来自键盘输入的值,将其存储于最后的变量名;-p后面接提示符,-t后面接超时时间(秒)
declare [选项] 变量名:声明变量的属性;-a将后面的变量定义为数组,-l赋值时将字符转为小写,-u赋值时将字符转为大写,-i 数据类型定义为整形数字,-x用法与export一样,将后面的变量变成环境变量,-r将后面的变量设置为只读(readonly)
运行shell时同时存在三种变量:

变量类型说明
局部变量局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问
环境变量所有的程序(包括shell启动的程序)都能访问环境变量
shell变量shell程序设置的特殊变量

特殊变量:

变量含义
$0当前脚本文件名
$数字传递给脚本或函数的第几个参数
$#传递给脚本或函数参数的个数
$*传递给脚本或函数的所有参数
$@传递给脚本或函数的所有参数
$?上个命令退出状态或者函数返回值
$$当前shell进程ID

$∗和 $@ 的区别为: ∗和@ 都表示传递给函数或脚本的所有参数,不被双引号(" “)包含时,都以"1”、“2” 、…、 “n"的形式输出所有参数。但是当它们被双引号(” “)包含时,”*" 会将所有的参数作为一个整体,以"1、2、 …、 n"的形式输出所有参数;“@” 会将各个参数分开,以"1"、“2” 、…、 “n” 的形式输出所有参数。
echo [选项] 字符串或者文字:在终端打印该内容
option:-e(对特殊字符进行转义)、-n(不换行);默认情况下不对特殊字符进行转义,并且换行

转义字符含义
\\反斜杆
\"双引号
\a响铃
\b退格(删除键)
\f换页
\n换行
\r回车
\t水平制表符(Tab)
\v垂直制表符

特殊情况——转义字符()自身的转义:shell在转义\时需要进行两次转义,因此如果转义一个\需要四个\,即"\\"转义得到\。
例如:

echo “\\\\” #得到\
echo -e “\\\\” #得到\

算数运算符:

运算符说明例子
+加法`expr $a + $b`
-减法`expr $a - $b`
*乘法`expr $a \* $b`
/除法`expr $a / $b`
%取余`expr $a % $b`
=赋值a = $b
==相等`expr $a == $b`
!=不相等`expr $a != $b`

注意:*前需要加转义字符(),并且表达式与运算符之间要有空格,方括号与变量以及变量与运算符之间也需要有括号

比较运算符:

运算符说明例子
-eq等于[ $a -eq $b ]或者(( $a == $b ))
-nq不等于[ $a -eq $b ]或者(( $a != $b ))
-gt(great)大于[ $a -eq $b ]或者(( $a > $b ))
-lt(less)小于[ $a -eq $b ]或者(( $a < $b ))
-ge大于等于[ $a -eq $b ]或者(( $a >= $b ))
-le小于等于[ $a -eq $b ]或者(( $a <= $b ))

布尔运算符:

运算符说明例子
非运算[ ! false ]
-o[ $a -eq $b -o $c -eq $d ]或者(( $a != $b -o $c != $d ))
-a[ $a -eq $b -a $c -eq $d ]或者(( $a != $b -a $c != $d ))

字符串运算符:

运算符说明例子
==字符串是否相等[ $a -eq $b ]或者(( $a == $b ))
!=字符串是否不等[ $a -nq $b ]或者(( $a != $b ))
-z字符串长度是否为0[ -z $a ]
-n字符串长度是否为0[ -n $a ]
str字符串长度是否为空[ str $a ]

Shell中的字符串

单、双引号的区别:单引号里的任何字符都会原样输出,但不能出现单引号(对单引号使用转义符后也不行),单引号字符串中的变量是无效的;双引号里可以出现转义字符,也可以有变量。

拼接字符串

country=“China”
echo “hello, $country”

获取字符串长度

country=“China”
echo ${#country} #输出5

提取字符串

country=“China”
echo ${country:1:3} #输出hin,1表示从第一个字符开始,3表示输出三个字符

查找子字符串

country=“China”
echo `expr index “$country” in` #输出3,输出查找到的字符中索引最小的值,若所有字符都没不存在则输出0

处理路径字符串

命令:basename 参数:-s、-a
-s .后缀名:用于去掉指定的文件的后缀名
-a:表示处理多个路径
例子:
basename /home/wq/test.txt #输出test.txt
basename -s .txt /home/wq/test.txt #输出test
basename -a /home/wq/test1.txt /home/wq/test2.txt #输出test1.txt和test2.txt
命令:dirname 参数:无
dirname /home/wq/script/test.txt #输出/home/wq/script
dirname /home/wq/script/test.txt /home/wq/script #输出/home/wq/script和/home/wq

Shell中的数组

bash支持一维数组, 不支持多维数组, 它的下标从0开始编号. 用下标[n] 获取数组元素

定义数组

在shell中用小括号表示数组,元素用空格分开,如array_name=(value0 value1 value2 value3);也可以单独定义数组的各个分量,可以不使用连续的下标,而且下标的范围没有限制,如:
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2

读取数组

读取某个下标的元素: a r r a y n a m e [ i n d e x ] 读取数组的全部元素,用 @ 或 ∗ : {array_name[index]} 读取数组的全部元素,用@或*: arrayname[index]读取数组的全部元素,用@{array_name[@]}或者${array_name[*]}

获取数组的信息:

取得数组元素的个数:length=${#array_name[@]}或者length=${#array_name[*]}
获取数组的所有下标:length=${!array_name[@]}或者length=${!array_name[*]}
取得数组单个元素的长度:lengthn=${#array_name[n]}

Shell中的条件语句

if语句

if [ 表达式 ] then 语句 fi
if [ 表达式 ] then 语句 else 语句 fi
if [ 表达式] then 语句 elif[ 表达式 ] then 语句 elif[ 表达式 ] then 语句 …… fi
例子:
a=10
b=20
if [ $a == $b ]
then
echo “a is equal to b”
else
echo “a is not equal to b”
fi

case …… esac语句

case 值 in
模式1)
command1
command2
command3
;;
模式2)
command1
command2
command3
;;
*)
command1
command2
command3
;;
esac

取值后面必须为关键字 in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。;; 与其他语言中的 break 类似,意思是跳到整个 case 语句的最后。2. 如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。

Shell中的循环语句

for语句

for 变量 in 列表
do
command1
command2

commandN
done
注意:列表是一组值(数字、字符串等)组成的序列,每个值通过空格分隔。每循环一次,就将列表中的下一个值赋给变量
例如:
for loop in 1 2 3 4 5
do
echo “The value is: $loop”
done

while语句

while command
do
Statement(s) to be executed if command is true
done
command 一般为条件表达式,如果返回值为true,则继续执行循环体内的语句,否则跳出循环
例如:
count=0
while [ $count-lt 5 ]
do
count=‘expr $count+1’
echo $count
done

unit语句

until command
do
Statement(s) to be executed until command is true
done
command 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环

Shell中自定义函数

函数的定义

function_name () {
list of commands
[ return value ]
}或者
function function_name () {
list of commands
[ return value ]
}

函数的使用

1、调用函数只需要给出函数名,不需要加括号,可以直接加参数,多个参数用空格隔开
2、 函数返回值,可以显式增加return语句;如果不加,会将最后一条命令运行结果作为返回值
3、Shell 函数返回值只能是整数,一般用来表示函数执行成功与否,0表示成功,其他值表示失败
例如:
function_name 参数1 参数2 参数3 … 参数n

函数的删除

删除函数也可以使用 unset 命令,不过要加上 .f 选项
例如:unset .f function_name

shell文件的包含

Shell可以包含外部脚本,将外部脚本的内容合并到当前脚本

第一种:. filename #点与filename之间有空格;
第二种:source filename #source 与filename之间有空格

Shell中进程相关命令

查看进程

命令:ps,process statue的缩写 参数:-e、-f
-e:显示所有进程
-f:全格式
例如:ps -ef #全格式显示所有进程

查找进程

命令:grep,Global Regular Expression Print的缩写 参数:-r、-v
-r:递归的方式查找符合条件的文件,当指定要查找的是目录而非文件时,必须使用这项参数
-v:显示不包含匹配文本的所有行
例如:grep -r “cd” /home/wq/shell_script #查找指定目录/home/wq/shell_script及其子目录(如果存在子目录的话)下所有文件中包含字符串"cd"的文件,并打印出该字符串所在行的内容
例如:grep -v “cd” script1.sh #查找文件script1.sh中不包含"cd"字符串的所有行内容

打印字段

命令:awk 参数:-F fs、-f file、-v var=val ‘脚本命令’ 文件名
-F fs: 指定以 fs 作为输入行的分隔符,awk 命令默认分隔符为空格或制表符
-f file:从脚本文件中读取 awk 脚本指令,以取代直接在命令行中输入指令
-v var=val:在执行处理过程之前,设置一个变量 var,并给其设备初始值为 val
例如:
awk ‘{print $2}’ test.txt
#$0 代表整个文本行;$1 代表文本行中的第1个数据字段;$2代表文本行中的第2个数据字段;$n代表文本行中的第n个数据字段

杀死进程

第一种:kill [选项] pid(进程ID号)
说明:kill -l可以列出所有可用的选项,其中常用的有-1、-9和-15;
1:重新加载进程;9:彻底杀死进程;15:安全的停止进程,也是默认情况
例如:kill 3606
第二种:pkill [选项] 进程名
说明:pkill -l可以列出所有可用的选项;
例如:pkill “bash”

Shell中打开新终端并执行命令

命令:gnome-terminal 参数1:–maximize、–full-screen、–title=“new title”、–window、–tab 参数2:-- 要执行的命令
maximize:打开后自动最大化
full-screen:打开后全屏
title:设置新打开的终端的标题
window:window的个数=用于显示终端的窗口数
tab:tab的个数+1=tab前窗口下终端个数
例如:
gnome-terminal --window --window #打开两个窗口用于显示终端
gnome-terminal --window --tab --window --tab --tab #打开两个窗口用于显示终端,第一个窗口下两个终端,第二个窗口下三个终端
例如:
gnome-terminal – ls #打开一个终端并执行ls命令,然后终端退出
gnome-terminal – bash -c “ls; exec bash” ##打开一个终端并执行ls命令,终端不退出
bash:命令处理程序
-c:要执行的命令不止一条
exec :bash内置命令,表示不启用新的shell进程,将当前shell进程替换为执行exec后命令的一个进程,执行完毕就退出,且exec命令后的其他命令将不再执行

Shell脚本的执行

方式一:./ filename或者sh filename
此方式执行脚本时,当前shell是父进程,生成一个子shell进程,在子shell中执行脚本。脚本执行完毕,退出子shell,回到当前shell。子shell继承父shell的环境变量,但子shell新建的、改变的变量不会被带回父shell,修改的上下文不会影响当前shell

例如:
#! /bin/bash
echo “current path:”
pwd
#子shell从父shell中继承了环境变量,但是执行后不会改变父shell的环境变量;因此子shell的当前路径与父shell的当前路径一致
cd /home/wq/catkin_ws/devel
echo “modified path:”
pwd
#子shell中的操作和环境变量不会影响父进程,在执行完shell后又回到了父进程;因此子shell的当前路径改为/home/wq/catkin_ws/devel后父进程的当前路径仍然是之前路径

注意:在父shell中使用export定义变量,子shell可以调用;但在子shell中使export定义变量,父shell无法调用

方式二:. filename或者source filename
此方式执行脚本时,在当前上下文中执行脚本,不会生成新的进程。脚本执行完毕,回到当前shell,修改的上下文会影响当前shell

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值