shell脚本的学习记录(不定时更新)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29238009/article/details/78183274

跟着菜鸟教程的shell编程做个学习记录:http://www.runoob.com/linux/linux-shell.html
学一点记一点,不然又容易忘。。。(ŎдŎ;)

第一章、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,那么就会输出12echo ${x} ${y}或者${x}'asd'${y},就会分别输出1 21asd2

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 ] 返回 truestr      检测字符串是否为空,不为空返回 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

猜你喜欢

转载自blog.csdn.net/qq_29238009/article/details/78183274