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