shell脚本的学习记录(不定时更新)
2017-10-09 15:43
423 查看
跟着菜鸟教程的shell编程做个学习记录:http://www.runoob.com/linux/linux-shell.html
学一点记一点,不然又容易忘。。。(ŎдŎ;)
第一章、shell创建和执行。
shell脚本的创建,新建个文本文件就好了,例如test.sh。sh结尾的文件哦,然后文件开头写上
这样就算是创建了一个空的shell脚本文件了吧,然后我们加上简单的echo。
好像语句后面加不加分号都行???应该是的,我加不加好像没什么影响,但是可能有些语句要分段明显的话还是加上分号吧。
保存后,那么这个脚本就算写好了,那么接下来我们在命令行里面执行。执行前先确保这个文件你这个角色有执行权限,然后进入这个文件所在的目录。运行这个脚本有两种方法:
1 . 执行
引用一下原教程的话:
注意,一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。
2 . 执行
第二章、shell变量
第三章、参数传递
第四章、数组
这个就略过了,第二章说变量的时候已经说过了,基本都说全了。
第五章、运算符
倒是没什么难度,但是比较多运算符,而且大部分和php js那些的使用方式有些不同,这里总结几个部分,写个表格会比较简洁易懂一点。
(算数运算符,两个反引号包起来的区间就当成是一个返回数值的函数用就好了,这是计算的运算符。其他的运算符基本都是判断运算符,比较常用在if之类的判断语句。)
(1)算数运算符(加减乘除这些)a=10 b=20
(2)关系运算符(比大小相等那些)a=10 b=20
(3)逻辑运算符(与或非)a=10 b=20
(4)字符串运算符(判断字符串是否相等、是否为空) a = “abc”, b = “efg”
(5)文件运算符(这个算是shell比较特有的逻辑运算符了,用来判断文件属性的)。变量 file 表示文件”/var/www/runoob/test.sh”,它的大小为100字节,具有 rwx 权限。
教程里面有一些demo,但是就是运算和if判断而已,我这里就不搬过来了,看这个表还不理解的可以去教程看看使用demo。
第五章、echo命令
教程里面有些应用是之前说单双引号的时候写了的,还有一些是后面输入输出重定向会说,这里就说一些没的。
学一点记一点,不然又容易忘。。。(ŎдŎ;)
第一章、shell创建和执行。
shell脚本的创建,新建个文本文件就好了,例如test.sh。sh结尾的文件哦,然后文件开头写上
#!/bin/bash
这样就算是创建了一个空的shell脚本文件了吧,然后我们加上简单的echo。
#!/bin/bash echo "hello power!";
好像语句后面加不加分号都行???应该是的,我加不加好像没什么影响,但是可能有些语句要分段明显的话还是加上分号吧。
保存后,那么这个脚本就算写好了,那么接下来我们在命令行里面执行。执行前先确保这个文件你这个角色有执行权限,然后进入这个文件所在的目录。运行这个脚本有两种方法:
1 . 执行
./test.sh
引用一下原教程的话:
注意,一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。
2 . 执行
/bin/sh test.sh
第二章、shell变量
1.变量创建 直接 变量名=变量值 就行了,例如 x='123',变量值如果是字符串的话,可以加单双引号或者不加。 其他和php变量规则没有很大差别,如果你php命名习惯规范得话,没有什么特别需要注意的。 注意点:(1)变量名和等号之间不能有空格 2.变量使用 例如上面的例子,那么使用x的语句就应该是,echo ${x}。这个花括号可以省略,但是养成好习惯吧,写个花括号不怕模糊了变量界限。 3.设置变量只读,删除变量 在变量命名好后,再执行 readonly ${x},这样x就变成只读变量了。使用unset ${x}就删除掉x了。 注意点:(1)只读变量后面不能再修改赋值,或者unset删除,否则会报错,但是后面的语句还是会执行 (2)教程上有一句话:变量被删除后不能再次使用。这句话的理解应该是unset后变量为空了,再次使用就不是原来的值了。 (我一开始理解成为被unset掉,在这次脚本中后续就不能再对x赋值使用,不能用这个变量名了。。。试了下是可以再赋值再使用的) 4.字符串的单双引号 str='123' 这个没什么好说的,单引号里面所有东西原样输出,不做任何处理,在脚本里面字面上写什么就输出字面的几个字, 不允许出现单引号或者转义单引号。双引号和php双引号差不多。 5.字符串拼接 也没什么拼接不拼接,教程到现在也只有echo比较利用字符串而已,在echo后面所有变量都是按顺序输出就是了。 例如echo ${x}${y},其中x=1,y=2,那么就会输出12,echo ${x} ${y}或者${x}'asd'${y},就会分别输出1 2,1asd2 6.字符串的一些基本操作 str='abcdef' (1)字符串长度echo ${#str} 输出6 (2)截取字符串echo ${str:1:2} 输出bc,从第1位后取两位 (3)查询子字符串 echo `expr index "$str" cd` 输出3,!这里用的是反引号! 7.数组 (1)创建,有两种方法,arr=('a' 'b' 'c')或者 arr[0]='a' arr[1]='b' arr[2]='c' 这里的下标是非负整数,下标可以不连续,例如arr[0] arr[3] arr[5],如果下标是其他东西, 例如arr[asd]之类的,那么就会顶替掉arr[0]的位置。例如 上面arr是a b c三个值,然后我在创建后再执行 arr[asd]=asd arr[zxc]=zxc 那么整个arr输出后,是zxc b c这三个值,就是最后一个奇怪的下标会顶替占据掉0下标的位置。 所以这个故事告诉我们,老老实实写数字下标(。・ω・。) (2)数组操作 数组单个元素和变量没有什么区别。 获取全部元素,${arr[@]}或者${arr[*]},echo出来就会将全部元素打出来 获取数组长度(就是一共有多少个元素啦),${#arr[@]}或者${#arr[*]}, 和获取字符串长度差不多,就把arr[@]当成一个变量就行了 8.注释 shell脚本里面#相当于php中的//,但是不支持多行注释,所以只能一行行注释,但是脚本里面有个操作说能把多行用花括号包起来当成函数, 然后注释这个函数就行了,但是用花括号包起来注释还是不行,可能是我函数格式不正规,后面搞明白了再补上
第三章、参数传递
这一章倒是没有什么,就是单纯的参数传递咯,算是一些微操作小tips。 在第一章执行shell脚本后面加上几个参数,例如: /bin/bash test.sh a b c 这样就将三个参数 a b c传进去了。使用这些参数像普通变量一样,不过它们是被定好变量名的。 ${0} 是脚本名,这里是test.sh。a b c分别为${1} ${2} ${3}。 然后教程里面还有一个表格的特殊变量,如下: 参数 说明 $# 传递到脚本的参数个数 $* 以一个单字符串显示所有向脚本传递的参数。 如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 $$ 脚本运行的当前进程ID号 $! 后台运行的最后一个进程的ID号 $@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。 如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。 $- 显示Shell使用的当前选项,与set命令功能相同。 $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 然后还解释了下$@ 和 $*的区别,就是当做数组来看吧,像是我例子写的 a b c,用$*就是['a b c'], 这里就只有一个元素,用$@就是['a','b','c'],三个元素。用一个循环输出$@和$*,他们的区别就很明显了。
第四章、数组
这个就略过了,第二章说变量的时候已经说过了,基本都说全了。
第五章、运算符
倒是没什么难度,但是比较多运算符,而且大部分和php js那些的使用方式有些不同,这里总结几个部分,写个表格会比较简洁易懂一点。
(算数运算符,两个反引号包起来的区间就当成是一个返回数值的函数用就好了,这是计算的运算符。其他的运算符基本都是判断运算符,比较常用在if之类的判断语句。)
(1)算数运算符(加减乘除这些)a=10 b=20
运算符 说明 举例 + 加法 `expr $a + $b` 结果为 30。 - 减法 `expr $a - $b` 结果为 -10。 * 乘法 `expr $a \* $b` 结果为 200。 / 除法 `expr $b / $a` 结果为 2。 % 取余 `expr $b % $a` 结果为 0。 注意:乘法这里要用反斜杠才能运算,包括expr这个语句的是反单引号 ` ,一般是Esc下面,Tab上面那个键位
(2)关系运算符(比大小相等那些)a=10 b=20
运算符 说明 举例 -eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。 -ne 检测两个数是否相等,不相等返回 true。 [ $a -ne $b ] 返回 true。 -gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。 -lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。 -ge 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。 -le 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。
(3)逻辑运算符(与或非)a=10 b=20
运算符 说明 举例 ! 非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。 -o 或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。 -a 与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。 补充: -o可以替换成 || ,-a可以替换成 && 。
(4)字符串运算符(判断字符串是否相等、是否为空) a = “abc”, b = “efg”
运算符 说明 举例 = 检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。 != 检测两个字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。 -z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。 -n 检测字符串长度是否为0,不为0返回 true。 [ -n $a ] 返回 true。 str 检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。
(5)文件运算符(这个算是shell比较特有的逻辑运算符了,用来判断文件属性的)。变量 file 表示文件”/var/www/runoob/test.sh”,它的大小为100字节,具有 rwx 权限。
操作符 说明 举例 -b 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。 -c 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。 -d 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。 -f 检测文件是否是普通文件(既不是目录,也不是设备文件), [ -f $file ] 返回 true。 如果是,则返回 true。 -g 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。 -k 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。 -p 检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。 -u 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。 -r 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。 -w 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。 -x 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。 -s 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。 -e 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。
教程里面有一些demo,但是就是运算和if判断而已,我这里就不搬过来了,看这个表还不理解的可以去教程看看使用demo。
第五章、echo命令
教程里面有些应用是之前说单双引号的时候写了的,还有一些是后面输入输出重定向会说,这里就说一些没的。
echo -e 操作,能够转换换行符。 例如换行符 \n: echo "asd \n"; echo "qwe"; 输出: asd \n qwe ______________ echo -e "asd \n"; echo "qwe" 输出: asd qwe 不换行换行符\c: echo "asd\c"; echo "qwe"; 输出: asd\c qwe ______________ echo -e "asd\c"; echo "qwe" 输出: asdqwe 补充: 1. 单引号也能在-e后转义换行符\n \c 2. 连续使用不换行符\c,可将多个echo语句拼接在一起,如 echo -e "asd\c"; echo -e "qwe\c"; echo -e "123" 输出的是asdqwe123
相关文章推荐
- Shell脚本实现每个工作日定时执行指定程序(学习记录)
- Shell脚本学习心得[持续更新]
- Shell 脚本编写记录(1)-find的学习
- 在这里记录自己学习中遇到的零碎的容易忽略的知识点,不定时总结更新
- shell 脚本记录学习
- Shell 脚本学习记录(一)
- [Linux学习]Shell脚本(1)--函数,输入,if判断(持续更新)+删除空行 +保存当前路径
- shell脚本学习(持续更新)
- Shell 脚本学习指南读书笔记(长期更新)
- Shell学习记录[原创更新中]
- git的学习记录(不定时更新)
- hadoop学习之HDFS(2.7):实例:开发shell脚本定时采集日志数据到hdfs
- 有关Web 安全学习的片段记录(不定时更新)
- 【不定时更新】记录舍友李优雅的前端学习历程
- git学习遇到问题记录。不定时更新
- shell脚本学习记录
- Git学习-->如何通过Shell脚本自动定时将Gitlab备份文件复制到远程服务器?
- shell脚本--持续更新
- bash脚本更新dnspod记录
- [R语言学习记录]-R脚本示例-指定运行工作目录