shell script简单笔记

时间:2021-04-28 20:28:46

变量

shell script是一种脚本语言,变量的定义是通过

myName=HYB

这样的形式定义的。

当存在空格时,可以通过双引号或单引号将其变为字符串。双引号不进行转义,单引号将内容进行转义为一般字符。\会进行转义。

执行命令

通过小括号$(command)或者是`command`可以执行指令,将执行结果返回。

?为上一个指令返回的值

命令

export

可以显示或增添变量,仅在当前会话中有效。

比如 export PATH=$PATH:/bin/bash

还可以将父进程中的自定义变量传递到子进程中。

export myName

echo

将变量进行输出

echo ${PATH}

unset

删除变量 unset myName

read

通过read可以接收键盘输入,如

read name

即可将键盘输入存入name变量中。

参数-t为限时,-p为提示文字。

declare

可以设置变量。declare [-aixr] variable 。-a为数组,-i为整形,-x为将其变为环境变量,-r将其设为不可改变。

test

可以对文件属性进行测试。

test -d file -a -w file 对file是否为目录并且具有w权限进行测试

控制符

删除

#为从前开始懒惰的匹配删除

##为从前开始贪婪的匹配删除

echo ${path##/*:}为只保留path的最后一个的删除操作

%为从后开始懒惰的匹配删除

%%为从后开始贪婪的匹配删除

echo ${path%%/*:}为只保留path的最后一个的删除操作

替换

${变量/旧字符串/新字符串}替换第一个匹配项

${变量//旧字符串/新字符串}替换所有匹配项

值的计算

${var-default}通过使用-可以设置变量默认值,变量var不存在时就会将default值赋予变量。

${var:-default}变量为空是也会设置默认值。

shell script简单笔记

正则表达式

通配符

字符 含义
[:alnum:] 0-9, AZ, az
[:alpha:] A-Z, a-z
[:blank:] 空格及tab
[:cntrl:] 代表键盘上面的控制按键,亦即包括CR, LF, Tab, Del.. 等等
[:digit:] 0-9
[:graph:] 空格与tab外的其他所有按键
[:lower:] a-z
[:print:] 所有能被打印的字符
[:punct:] 标点符号
[:upper:] A-Z
[:space:] 空白字符,包括空格键, [Tab], CR 等等
[:xdigit:] 代表16 进位的数字类型,因此包括: 0-9, AF, af 的数字与字符

控制符

‘[char]’为char中的任意一个字符

‘[^char]’为不在char中的任意一个字符

^表示行首,$表示行尾

.为任意一个字符,*为重复0到无限次前一个字符

+为1个或以上前一个字符,?为0个或一个前一个字符

{a,b}为重复前一个字符的a到b次,()为组群

|为或符号

命令的执行

cmd;cmd可以按顺序从前到后执行命令

&&和||为逻辑运算符,遵循短路原则,对命令返回结果是否正确进行判断,也就是&&要两个都成功执行,||要最起码一个成功执行

管线

|为管线,前面的标准输出会作为下一个指令的标准输入。

减号

在管线中,可以用-代替在指令中代替stdin和stdout

管线命令

cut

从每行输出中切分出一部分

cut [-bn] [file]

cut [-c] [file]

cut [-df] [file]

-b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。

-c :以字符为单位进行分割。

-d :自定义分隔符,默认为制表符。

-f :与-d一起使用,指定显示哪个区域。

-n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的范围之内,该字符将被写出;否则,该字符将被排除

echo ${PATH} | cut -d ':' -f 3,5 将PATH变量按:进行分割,取出来第3-5项

grep

从输出中提取部分行

grep [-acinv] [--color=auto] '搜寻字串' filename

选项与参数:

-a :将binary文件以text文件的方式搜寻资料

-c :计算找到'搜寻字串'的次数

-i :忽略大小写的不同

-n :输出行号

-v :反向选择,亦即显示出没有'搜寻字串' 内容的那一行!

last | grep 'root'

sort

排序,按照字典序排序

sort [-fbMnrtuk] [file or stdin]

选项与参数:

-f :忽略大小写的差异,例如A 与a 视为编码相同;

-b :忽略最前面的空白字元部分;

-M :以月份的名字来排序,例如JAN, DEC 等等的排序方法;

-n :使用『纯数字』进行排序(预设是以文字型态来排序的);

-r :反向排序;

-u :就是uniq ,相同的资料中,仅出现一行代表;

-t :分隔符号,预设是用[tab] 键来分隔;

-k :以那个区间(field) 来进行排序的意思

cat /etc/passwd | sort -t ':' -k 3,3 以:切分,以第三列排序

uniq

输出仅显示一次uniq [-ic]

选项与参数:

-i :忽略大小写字元的不同;

-c :进行计数

wc

统计字数。wc [-lwm]

选项与参数:

-l :仅列出行;

-w :仅列出多少字(英文单字);

-m :多少字元;

tee

可以将stdout输出到文件中。tee [-a] file

选项与参数:

-a :以累加(append) 的方式,将资料加入file 当中

tr

将文本替换或删除。tr [-ds] SET1 ...

选项与参数:

-d :删除讯息当中的SET1 这个字串;

-s :取代掉重复的字元!

last|tr [a-z] [A-Z] 将小写替换成大写

last|tr -d :从输出中删除:

col

将输出按列切分,并将列间tab分隔符改为一个“ ”。

last||col -x

join

将两个文件以行为单位拼接到一起。join [-ti12] file1 file2

选项与参数:

-t 预设以空白字元分隔资料,并且比对『第一个栏位』的资料,

如果两个档案相同,则将两笔资料联成一行,且第一个栏位放在第一个!

-i :忽略大小写的差异;

-1 :这个是数字的1 ,代表『第一个档案要用那个栏位来分析』的意思;

-2 :代表『第二个档案要用那个栏位来分析』的意思。

paste

将两个文件的行直接拼合,以tab分割

paste test1 teatime2

expand

将tab键转换为空格键

split

split [-bl] file PREFIX

选项与参数:

-b :后面可接欲分割成的档案大小,可加单位,例如b, k, m 等;

-l :以行数来进行分割。

xargs

xargs [-0epn] command

选项与参数:

-0 :如果输入的stdin 含有特殊字符,例如`, , 空白键等等字元时,这个-0 参数

可以将它转义。

-e :这个是EOF (end of file) 的意思。后面可以接一个字符串,当xargs分析到这个字串时,

就会停止继续工作!

-p :在执行每个指令的argument时,都会询问使用者的意思;

-n :后面接次数,每次command指令执行时,要使用几个参数的意思

cut -d ':' -f 1 /etc/passwd | head -n 3 | xargs -p -n 1 id 将/etc/passwd中的:前的第一部分的前三行取出来,每次作为1个参数交由id指令处理

sed

sed [-nefr] [动作]

选项与参数:

-n :使用安静(silent)模式。在一般sed 的用法中,所有来自STDIN 的资料一般都会被列出到萤幕上。

但如果加上-n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。

-e :直接在指令列模式上进行sed 的动作编辑;

-f :直接将sed 的动作写在一个档案内, -f filename 则可以执行filename 内的sed 动作;

-r :sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)

-i :直接修改读取的档案内容,而不是由萤幕输出。

动作说明: [n1[,n2]]function

n1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作

是需要在10 到20 行之间进行的,则『 10,20[动作行为] 』

function 有底下这些咚咚:

a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~

c :取代, c 的后面可以接字串,这些字串可以取代n1,n2 之间的行!

d :删除,因为是删除啊,所以d 后面通常不接任何咚咚;

i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);

p :列印,亦即将某个选择的资料印出。通常p 会与参数sed -n 一起运作~

s :取代,可以直接进行取代的工作哩!通常这个s 的动作可以搭配正规表示法!

例如1,20s/old/new/g

nl /etc/passwd | sed '2,5d' 打印出来passwd然后删除第2-5行

脚本的编写

参数的传递

$# 表示传入脚本参数的个数

$@ 表示传入参数的数组

$* 表示传入参数的字符串

$0 $1 $2 $3 分别代表执行的脚本/函数名,传入的第1,2,3个参数

shift 指令可以从前到后移走参数

脚本的运算

var=$((运算内容))

脚本的判断

[]可对脚本内的表达式进行判断

[]内的内容要使用空格进行分割,内容粘连会导致逻辑出错。

脚本的流程控制

判断语句

多个条件判断(if ... elif ... elif ... else)分多种不同情况执行

if [条件判断式一]; then
当条件判断式一成立时,可以进行的指令工作内容;
elif [条件判断式二]; then
当条件判断式二成立时,可以进行的指令工作内容;
else
当条件判断式一与二均不成立时,可以进行的指令工作内容;
fi

分支语句

case $变量名称in    <==关键字为case ,还有变量前有钱字号
"第一个变量内容" ) <==每个变量内容建议用双引号括起来,关键字则为小括号)
程序段
;; <==每个类别结尾使用两个连续的分号来处理!
"第二个变量内容" )
程序段
;;
* ) <==最后一个变量内容都会用*来代表所有其他值
不包含第一个变量内容与第二个变量内容的其他程序执行段
exit 1
;;
esac

循环

while [ condition ]   <==中括号内的状态就是判断式
do <==do是循环的开始!
程序段落
done <==done是循环的结束 until [ condition ]
do
程序段落
done for var in con1 con2 con3 .../for var in $(seq 1 100)
do
程序段
done for ((初始值;限制值;执行步阶))
do
程序段
done

函数

function fname () {
程序段
}

执行与debug

sh [-nvx] scripts.sh

选项与参数:

-n :不要执行script,仅查询语法的问题;

-v :再执行sccript 前,先将scripts 的内容输出到萤幕上;

-x :将使用到的script 内容显示到萤幕上,这是很有用的参数!

执行方式的区别

使用sh或.直接执行时,系统会进入脚本子线程运行脚本

当使用source 指令执行脚本时,会直接在当前线程执行脚本