shell script简单笔记
变量
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}变量为空是也会设置默认值。
正则表达式
通配符
字符 | 含义 |
---|---|
[: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 指令执行脚本时,会直接在当前线程执行脚本