Shell编程基础

注:

  1. 本文说的都是bash(Bourne Again Shell),是sh(Bourne Shell)的扩展
  2. 扩展名不会影响脚本执行,见名知意就行,一般情况下扩展名是sh
  3. Shell注释:以 # 开头的行就是注释,会被解释器忽略,但是sh里面没有多行注释,只能每行加一个#
  4. 从Ubuntu 6.10开始,默认使用dash,需要手动执行命令将dash改为bash, 至于bash和dash的区别,详见https://blog.csdn.net/hshl1214/article/details/51122663
    1. 命令:sudo dpkg-reconfigure dash
    2. 然后在出现的页面中选择NO,之后就可以正常运行脚本了

运行Shell脚本的两种方法:

  1. 作为可执行程序
    1. 让脚本文件具有可执行权限 chmod +x file 加上执行权限,否则会提示无执行权限。
    2. ./文件名
    3. 注意,例要执行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 /bin/php test.php

Shell变量

  1. 定义变量的时,变量前不加美元符号,变量名和等号之间不能有空格 name="小明"
  2. 使用语句给变量赋值 for file in `ls /etc` for file in $(ls /etc)
  3. 使用变量 使用一个定义过的变量,只要在变量名前加 $ 符号即可 第二次给变量赋值的时候也不能加 $ 变量名外加上花括号能够帮助识别器识别变量的边界,推荐给所有变量加上花括号
  4. 只读变量 readonly myUrl="http://www.w3cschool.cc" readonly myUrl
  5. 删除变量 unset unset 变量名
  6. Shell字符串 字符串可以用单引号,也可以使用双引号,也可以不用引号。
    1. 获取字符串长度 string="abcd" echo ${#string} #输出 4
    2. 提取子字符串 #从第2个字符开始截取4个字符 string="runoob is a great site" echo ${string:1:4} # 输出 unoo
    3. 查找字符串 string="runoob is a great company" echo `expr index "$string" is` # 输出 8
  7. Shell数组 Shell只支持一维数组
    1. 定义数组 数组名=(值1 值2 值3 ……) 或 array_name[0]=value0 array_name[1]=value1 array_name[n]=valuen
    2. 读取数组 ${数组名[下标]} 使用@符号可以获取数组中的所有元素 例:echo ${array_name[@]}
    3. 获取数组的长度 length=${#array_name[@]} length=${#array_name[*]}

Shell传递参数

请参考:菜鸟教程参数传递 在执行脚本的时候可以向脚本传递参数,脚本获取参数的格式为:$n

Shell基本运算符

  1. 原生的bash不支持数学运算,但可以通过 awk 和 expr 命令来实现 expr 是一款表达式计算工具,可以用来完成表达式的求值操作 例:两个数相加 (注意==使用的是反引号,不是单引号==) #!/bin/bash val=`expr 2 + 2` echo "两数之和为 : $val"
  2. 注意:条件表达式要放在方括号之间,并且要有空格,例如: [\(a==\)b] 是错误的,必须写成 [ $a == $b ]。
  3. == != 用来比较两个数字

Shell test命令

请参考:菜鸟教程 test命令

Shell流程控制

  1. if else 相关 if condition1 then command1 elif condition2 then command2 else commandN fi
  2. for循环 for var in item1 item2 ... itemN do command1 command2 ... commandN done
  3. while 循环 while condition do command done
  4. 无限循环 #无限循环语法格式: while : do command done #或者 while true do command done #或者 for (( ; ; ))
  5. util 循环 until循环执行一系列命令直至条件为真时停止。 until condition do command done
  6. case 例: echo '输入 1 到 4 之间的数字:' echo '你输入的数字为:' read aNum case $aNum in 1) echo '你选择了 1' ;; 2) echo '你选择了 2' ;; 3) echo '你选择了 3' ;; 4) echo '你选择了 4' ;; *) echo '你没有输入 1 到 4 之间的数字' ;; esac
  7. 跳出循环
    1. break
    2. continue

Shell函数

  1. 函数定义 [ function ] funname [()] { action; [return int;] }
  2. 函数参数 funWithParam(){ echo "第一个参数为 $1 !" echo "第二个参数为 $2 !" echo "第十个参数为 $10 !" echo "第十个参数为 ${10} !" echo "第十一个参数为 ${11} !" echo "参数总数有 $# 个!" echo "作为一个字符串输出所有参数 $* !" } funWithParam 1 2 3 4 5 6 7 8 9 34 73 Shell 输入/输出重定向 请参考:菜鸟教程 Shell 输入/输出重定向
    1. 常见符号 > >> < <<
    2. 输出重定向 command1 > file1 注意:任何file1内的已经存在的内容将被新内容替代。如果要将新内容添加在文件末尾,请使用>>操作符
    3. 输入重定向 command1 < file1
    4. Here Document Here Document 是 Shell 中的一种特殊的重定向方式,用来将输入重定向到一个交互式 Shell 脚本或程序。 command << delimiter document delimiter 注意:结尾的delimiter前后一定要顶格写,前面及后面都不能有任何字符 例: cat << EOF 欢迎来到 菜鸟教程 www.runoob.com EOF
    5. /dev/nul是一个特殊的文件,写入到它的内容都会被丢弃,将命令的输出重定向到它会起到“禁止输出”的效果 $ command > /dev/null

Shell 文件包含

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

例: 有两个脚本,内容如下 test1.sh

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

url="http://www.runoob.com"

test2.sh

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

#使用 . 号来引用test1.sh 文件
. ./test1.sh

# 或者使用以下包含文件代码
# source ./test1.sh

echo "菜鸟教程官网地址:$url"

然后执行test2.sh

$ chmod +x test2.sh 
$ ./test2.sh  
#结果:菜鸟教程官网地址:http://www.runoob.com

注:本文参考:菜鸟教程文档 如需转载请注明出处:http://www.cnblogs.com/zhuchenglin/p/8743180.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏农夫安全

【weakfilescan】敏感文件扫描工具

weakfilescan 基于爬虫,动态收集扫描目标相关信息后进行二次整理形成字典规则,利用动态规则的多线程敏感信息泄露检测工具,支持多种个性化定制选项,包括...

4478
来自专栏C/C++基础

Shell特殊字符

shell既是类Unix操作系统的命令解析器,用于解释执行用户输入的一连串命令,它类似于DOS下的command和后来Windows的cmd.exe。同时she...

1521
来自专栏xingoo, 一个梦想做发明家的程序员

数字按照不同格式转换成字符串

  如果自己写函数,不使用itoa怎么判断呢?   我们用通常的办法,对数字进行每位的除商,得到后与字符'0'相加。 flag = 0; ...

20710
来自专栏小樱的经验随笔

【批处理学习笔记】第十五课:语句结构(1)

    类似于C语言,批处理也有它的语句结构。批处理的语句结构主要有选择结构(if语句)、循环结构(for语句)等。   if语句(选择结构)     if语...

2869
来自专栏专注 Java 基础分享

字节码文件的内部结构之谜

如果计算机的 CPU 只有「x86」这一种,或者操作系统只有 Windows 这一类,那么或许 Java 就不会诞生。Java 诞生之初就曾宣扬过它的初衷,「一...

4009
来自专栏轮子工厂

一篇文章帮你解决中文乱码问题---JavaWeb中文编码问题全面解析

这就是为什么我们在浏览器的地址栏中能看到中文,但是把地址拷贝出来后中文就变成了一些奇怪的串了。

6594
来自专栏python3

习题18:命名,变量,代码,函数

1. 首先告诉python创建一个函数,使用的命令是def,也就是定义(define)的意思

822
来自专栏Jackson0714

【.Net底层剖析】3.用IL来理解属性

3347
来自专栏编程微刊

回调函数路由,模板渲染

1605
来自专栏轮子工厂

Java多线程学习

提醒一下大家:main方法其实也是一个线程。在java中所以的线程都是同时启动的,至于什么时候,哪个先执行,完全看谁先得到CPU的资源。

1282

扫码关注云+社区

领取腾讯云代金券