Shell编程总结

一、Hello World

新建文件test.sh

然后编辑代码:

#!bin/bash/

echo “hello world !”

cd 到目标目录下:

chmod +x ./test.sh    #使脚本有执行权限

./test.sh        #运行脚本

另一种运行方式:

sh test.sh

二、变量

  1. 变量名要求:

a)     只能是数字,字符,下划线,并且首字母不能是数字

b)     中间不能有空格,但是可以有下划线

c)      不能用关键词

  1. 使用变量:
myshell=”12345”

echo ${myshell}

花括号加不加都行,加花括号只是方便解释器识别变量边界。

另外变量和运算符之间不能有空格。

  1. 只读变量
myshell=“1234”

readonly myshell

只读变量意味着不能更改

  1. 删除变量
myshell=”1234”

unset myshell

echo myshell #可以看到什么也没输出

  1. 变量类型

a)     局部变量:只在shell中起作用,shell运行的时候其他命令不能调用它

b)     环境变量:shell运行的时候,其他命令可以调用的

c)      shell变量:是由shell程序设置的特殊变量,有局部变量也有环境变量,这些变量是保证shell的正常运行

  1. shell字符串

a)     单引号:

i.          任何字符都会原样输出,单引号里面的变量无效

ii.          单引号里面不能出现单引号(转义的也不行)

b)     双引号

i.          双引号里可以有变量

ii.          双引号里可以出现转义字符

eg:

#!/bin/bash

yourname='lihua'

myshell="Hello, I know you are \"${yourname}\"!"

echo ${myshell}
  1. 拼接字符:
#!/bin/bash

yourname="lihua"

chat="Hello, "$yourname" !"

chat1="Hello, ${yourname} !"

echo ${chat} ${chat1}
  1. 获取字符串长度
#!/bin/bash

myshell=""

echo ${#myshell}
  1. 提取子串
#!/bin/bash

string="I'm AI"

echo ${string:1:2}

这个地方运行的时候用sh test.sh可能会不兼容,可以用 chmod +x ./test.sh运行

  1. 查找子串
#!/bin/bash

string="hello, AI"

echo `expr index "$string" h` #两边的不是单引号是Esc键下边的那个符号,句式是固定的的
  1. shell数组

shell只支持一维数组

a)     格式:

数组名=(val1 val2…) #用空格分离

value=(1 2 3 4)

b)     随机访问下标:

value[1]=1

c)      读取数组:

i.          ${数组名[下标]}

ii.          读取全部元素${数组名[@]}

d)     获取长度

# 取得数组元素的个数

length=${#数组名[@]}

# 或者

length=${#数组名[*]}

# 取得数组单个元素的长度

lengthn=${#数组名[n]}

  1. shell注释

前面加#

三、shell传递参数

传递参数的格式,$n,$0表示执行文件名,$1表示第一个参数,之后以此类推:

A+B的小例子:

 #!/bin/bash

echo "name:$0"

a=$1

b=$2

c=`expr ${a} + ${b}`

echo ${c}

几个特殊符号:

参数处理

说明

$#

传递到脚本的参数个数

$*

一第一个单字符显示所有脚本传递的参数。

$$

脚本运行的当前进程ID号

$!

后台运行的最后一个进程的ID号

$@

与$*相同,使用时加引号,是返回每个参数

$-

显示shell使用的当前选项,与set命令功能相同

$?

显示最后命令的退出状态。0表示没有错误,其他任何值都表示有错误。

四、shell基本运算符

a)     基本包括:算数运算符、关系运算符、布尔运算符、字符串运算符、文件测试运算符。

bash不支持原生的数学运算,可以通过其他命令来实现,awk和expr

b)     算数运算符

运算符

说明

举例

+

加法

`expr $a + $b`

-

减法

`expr $a - $b`

*

乘法

`expr $a * $b`

/

除法

`expr $a / $b`

%

取余

`expr $a % $b`

=

赋值

a=$b

==

相等,返回true

[$a == $b]

!=

不相等,返回true

[$a != $b]

#!/bin/bash

a=1

b=2

if [ $a == $b ]

then     

       echo "equal"

fi

if [ $a != $b ]

then

       echo "not equal"

fi

c)      关系运算符

运算符

说明

举例

-eq

两个数是否相等

[ $a –eq $b ]

-ne

两个数是否不相等

[ $a –ne $b ]

-gt

左边是否大于右边

[ $a –gt $b ]

-lt

左边是否小于右边

[ $a –lt $b ]

-ge

左边是否大于等于右边

[ $a –ge $b ]

-le

左边是否小于等于右边

[ $a –le $b ]

d)     布尔运算符

运算符

说明

举例

!

非运算

[ ! false ]

-o

或运算

[ $a –lt 20 –o $b –gt 100 ]

-a

与运算

[ $a –lt 20 –a $b –gt 100 ]

e)     逻辑运算符

运算符

说明

举例

&&

逻辑的AND

[[ $a -lt 100 && $b -gt 100 ]]

||

逻辑的 OR

[[ $a -lt 100 || $b -gt 100 ]]

f)      字符串运算符

运算符

说明

举例

=

检测两个字符串是否相等

[ $a = $b ]

!=

检测两个字符串是否不等

[ $a != $b ]

-z

检测字符串长度是否为零

[ -z $a ]

-n

检测字符串长度是否不0

[ -z $a ]

str

检测字符串是否为空

[ $a ]

g)     文件测试符

操作符

说明

举例

-b file

检测文件是否是块设备文件

[ -b $file ]

-c file

检测文件是否是字符设备文件

[ -c $file ]

-d file

检测文件是否是目录

[ -d $file ]

-f file

检测文件是否是普通文件

[ -f $file ]

-g file

检测文件是否设置了SGID位

[ -f $file ]

-k file

检测文件是否设置了黏着位

[ -k $file ]

-p file

检测文件是否有名管道

[ -p $file ]

-u file

检测文件是否设置了SUID位

[ -u $file ]

-r file

检测文件是否可读

[ -r $file ]

-w file

检测文件是否可写

[ -w $file ]

-x file

检测文件是否可执行

[ -x $file ]

-s file

检测文件是否为空

[ -s $file ]

-e file

检测文件是否存在

[ -e $file ]

五、echo命令

a)     显示字符串

i.          echo “It is a test”

ii.          双引号可以省略:echo It is a test

b)     显示转义字符

i.          echo “\”It is a test \””

c)      显示变量

#!/bin/bash

read name

echo "$name from read"

d)     显示换行

i.          echo –e “ok! \n” # -e 开启转义

echo “It is a test”

e)     显示不换行

i.          echo –e “ok! \c” # -e 开启转义

echo “It is a test”

f)      将结果重定向至文件

i.          echo “It is a test” > myfile

g)     原样输出到字符串,不进行转移或取变量

i.          echo ‘$name\”’s

h)     显示执行命令结果

i.          echo `date`  #这里用的是反引号

六、Shell流程控制、

a)     if

语法格式:

if condition

then
command1 command2 … fi

b)     if else

if condition

then

       command1

       …

else

       command1

       …

fi

c)      if else-if else

if condition1

then

       command1

elif condition2

then

       command1

else

       commandm

fi

d)     for 循环

格式:

for var in item1 item2 … itemN

do

    command1

    command2

    …

Done

例子:

#!/bin/bash

value=(A B C D)

for var in ${value[@]}

do

       echo "The value is: $var"

done

for loop in A B C D

do  

       echo "The value is: $loop"

done

e)     while循环

while condition

do

       command

done

例子:

#!/bin/bash

int=1

while(( $int<=5 ))

do

       echo $int

       let "int++"

done

f)      until循环

就像do-while和while循环的区别一样

g)     case

就像switch。

格式:

case 值 in

       模式1)

              command1

              …

              ;;

       模式2)

              command2

              …

              ;;

       esac #就像C语言中的default

h)     break、continue、esac

七、shell函数

格式:

 [ function ] funname [()]

{

           action;

           [return int;]

}

例子:

 #!/bin/bash

demoFun() {

                            echo "$1"

                            echo "$2"

}

demoFun 100 110

八、输入输出重定向

命令

说明

Command > file

将输出重定向到file

Command < file

将输入重定向到file

Command >> file

将输出以追加的方式重定向到file

n > file

将文件描述符为n的文件重定向到file

n >> file

将文件描述符为n的文件以追加的方式重定向到file

n >& m

将输出文件m和n合并

n <& m

将输入文件m和n合并

<< tag

将开始标记tag和结束标记tag之间的内容作为输入

九、Shell文件包含

格式:

. filename #注意点号和文件名中间有一空格

source filename

实例:

test1.sh

#!/bin/bash

url=http://www.runoob.com

test2.sh

#!/bin/bash

#通过.号来引用test1.sh文件,这样test1.sh中的东西test2.sh就能用了

. ./test1.sh

echo "$url"

Shell编程学习总结的更多相关文章

  1. Linux 下shell 编程学习脚手架

    linux body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-t ...

  2. shell编程学习之使用jq对json数据进行提取

    shell编程学习之使用jq对json提取 jq命令允许直接在命令行下对JSON进行操作,包括分片.过滤.转换等 ,jq是用C编写,没有运行时依赖,所以几乎可以运行在任何系统上.预编译的二进制文件可以 ...

  3. Linux Shell编程学习笔记——目录(附笔记资源下载)

    LinuxShell编程学习笔记目录附笔记资源下载 目录(?)[-] 写在前面 第一部分 Shell基础编程 第二部分 Linux Shell高级编程技巧 资源下载 写在前面 最近花了些时间学习She ...

  4. shell编程学习笔记(一):编写我的第一段代码

    目前在学习Shell编程,我会把我的学习笔记记录在这里.大神可以直接略过~ 嗯,第一段代码,肯定是要输出Hello World了~ 以下蓝色字体的内容为linux命令,红色字体的内容为输出的内容: # ...

  5. shell编程学习笔记之sed编辑器

    在shell编程中,大多数处理的都是文本文件.对文本文件进行处理除了使用交互式文本编辑器(vi[m],gedit......)也可以使用另外一类:流编辑器. 流编辑器:使用预定义的编辑规则来对文本进行 ...

  6. shell编程学习1

    1.shell是操作系统的终端命令行 (1)shell可以理解为软件系统提供给用户操作的命令行界面,可以说它是人机交互的一种方式.    (2)我们可以使用shell和操作系统.uboot等软件系统进 ...

  7. shell编程学习笔记【原创】

    本文为本人学习笔记,如有转载请注明出处,谢谢 一.Bourne Shell 有如下四种变量: 用户自定义变量 位置变量,即命令行参数 预定义变量 环境变量 二.位置变量 $ 与键入的命令行一样,包含脚 ...

  8. (七)shell编程学习

    1.shell程序练习:创建一个dir文件夹,在dir文件夹里再创建一个cd.c文件 首先vim hello.sh 2.shell中的变量定义和引用 (1)变量定义和初始化.shell是弱类型语言(语 ...

  9. shell编程学习笔记(十):Shell中的for循环

    shell编程中可以实现for循环遍历 先来写一个最简单的吧,循环输出从1到10,脚本内容为: #! /bin/sh for i in {1..10} do echo $i done 上面的代码从1到 ...

  10. shell编程学习笔记(八):Shell中的if条件判断

    编程语言中都有条件判断,shell编程也不例外,下面我们来看一下shell中应该怎么使用if条件判断 以下蓝色字体部分为Linux命令,红色字体的内容为输出的内容: # cd /opt/scripts ...

随机推荐

  1. 【转载】深入研究Windows内部原理绝对经典的资料

    原文:深入研究Windows内部原理绝对经典的资料 另一篇资料:深入研究Windows内部原理系列 (为了方便大家下,我打包了放在一下地址: 1-6:http://download.csdn.net/ ...

  2. LeetCode:49. Group Anagrams(Medium)

    1. 原题链接 https://leetcode.com/problems/group-anagrams/description/ 2. 题目要求 给定一个字符串数组,将数组中包含相同字母的元素放在同 ...

  3. 8、Java并发编程:同步容器

    Java并发编程:同步容器 为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器.并发容器.阻塞队列.Synchronizer(比如CountDownLatch). ...

  4. 第三模块:面向对象&网络编程基础 第4章 FTP项目作业讲解

    01-FTP项目需求 02-FTP项目框架搭建 03-FTP项目用户认证 04--FTP项目制定标准定长消息头 05-FTP项目下载功能开发 06-FTP项目下载功能开发2 07-FTP项目ls文件列 ...

  5. 硬盘基础知识&&分区

    学习记录的笔记,虽然毫无章法 硬盘基础知识 磁盘的物理组成 如下图所示: 有关磁盘物理知识的详细介绍请看硬盘的存储原理和内部架构这篇博文 硬盘接口类型 IDE SATA SCSI SAS 光纤通道 I ...

  6. 洛谷 P1706 全排列问题 :STL / dfs

    题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入输出格式 输入格式: n(1≤n≤9) 输出格式: 由1-n组成的所有不重复的数字序列, ...

  7. [2018 ACL Short and System] 对话系统

    Short Paper(s) 1.  Task-oriented Dialogue System for Automatic Diagnosis. (Cited by 0) Zhongyu Wei, ...

  8. Kali信息收集-DNS

    1.whois查询 直接在终端输入whois 域名 2.查找dns服务器 (1)host (2)dig (3)nslookup 3.域传输 4.域名枚举 (1)dnsdict6 kali没有集成这款工 ...

  9. C#调用mingw的so库时无法加载DLL###.so 找不到指定的模块

    使用C#调用mingw的so,报了c# 无法加载DLL“###.so”,: 找不到指定的程序. (异常来自 HRESULT:0x8007007E)开始以为是dll路径问题,使用全路径确认正确后仍然无法 ...

  10. Reversing Encryption(模拟水题)

    A string ss of length nn can be encrypted(加密) by the following algorithm: iterate(迭代) over all divis ...