加入收藏 | 设为首页 | 会员中心 | 我要投稿 均轻资讯网 (https://www.ijunqing.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

UNIX Shell数组 shell脚本的编写与运用

发布时间:2022-10-13 15:32:27 所属栏目:Unix 来源:
导读:  Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。用户直接面对的不是计算
  Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。用户直接面对的不是计算机硬件而是shellUNIX Shell数组,用户把指令告诉shell,然后shell再传输给系统内核,接着内核再去支配计算机硬件去执行各种操作。在linux的世界中,大多数配置文件都是ASCII的纯文本形式存在的。纯文本文件记录的就是0,1,而我们通过文件编码系统(ASCII系统)转换成我们认识的文字。
 
  对shell的认识真正维护系统都是自动化脚本运维
 
  #! 是一个约定的标记,告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序,即使用哪一种 Shell,本文使用:
 
  echo 命令用于向窗口输出文本。
 
  运行 Shell 脚本有两种方法:
 
  1、作为可执行程序
 
  将上面的代码保存为 test.sh,并 cd 到相应目录:
 
  chmod +x ./test.sh #使脚本具有执行权限
 
  ./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、作为解释器参数
 
  这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如: /bin/sh test.sh
 
  定义变量时,变量名不加美元符号($,PHP语言中变量需要),如:
 
  your_name="runoob.com"
 
  注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
 
  首个字符必须为字母(a-z,A-Z)。
 
  中间不能有空格,可以使用下划线(_)。
 
  不能使用标点符号。
 
  不能使用bash里的关键字(可用help命令查看保留关键字)。
 
  除了显式地直接赋值,还可以用语句给变量赋值,如:
 
  for file in `ls /etc`
 
  以上语句将 /etc 下目录的文件名循环出来。
 
  三、使用变量
 
  使用一个定义过的变量,只要在变量名前面加美元符号即可,如:
 
  your_name="qinjx"
 
  echo $your_name
 
  echo ${your_name}
 
  变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:
 
  for skill in Ada Coffe Action Java; do
 
  echo "I am good at ${skill}Script"
 
  done
 
  如果不给skill变量加花括号,写成echo "I am good at $skillScript",解释器就会把$skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。
 
  推荐给所有变量加上花括号,这是个好的编程习惯。
 
  已定义的变量,可以被重新定义,如:
 
  your_name="tom"
 
  echo $your_name
 
  your_name="alibaba"
 
  echo $your_name
 
  这样写是合法的,但注意,第二次赋值的时候不能写$your_name="alibaba",使用变量的时候才加美元符($)。
 
  只读变量
 
  使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
 
  下面的例子尝试更改只读变量,结果报错:
 
  #!/bin/bash
 
  myUrl="菜鸟教程 - 学的不仅是技术,更是梦想!"
 
  readonly myUrl
 
  myUrl="菜鸟教程 - 学的不仅是技术,更是梦想!"
 
  运行脚本,结果如下:
 
  /bin/sh: NAME: This variable is read only.
 
  删除变量
 
  使用 unset 命令可以删除变量。语法:
 
  unset variable_name
 
  变量被删除后不能再次使用。unset 命令不能删除只读变量。
 
  实例
 
  #!/bin/sh
 
  myUrl="菜鸟教程 - 学的不仅是技术,更是梦想!"
 
  unset myUrl
 
  echo $myUrl
 
  以上实例执行将没有任何输出。
 
  变量类型
 
  运行shell时,会同时存在三种变量:
 
  1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
 
  2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
 
  3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
 
  Shell 字符串
 
  字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。单双引号的区别跟PHP类似。
 
  单引号
 
  str='this is a string'
 
  单引号字符串的限制:
 
  单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
 
  单引号字串中不能出现单引号(对单引号使用转义符后也不行)。
 
  双引号
 
  your_name='qinjx'
 
  str="Hello, I know your are \"$your_name\"! \n"
 
  双引号的优点:
 
  双引号里可以有变量
 
  双引号里可以出现转义字符
 
  拼接字符串
 
  your_name="qinjx"
 
  greeting="hello, "$your_name" !"
 
  greeting_1="hello, ${your_name} !"
 
  echo $4greeting $greeting_1
 
  获取字符串长度
 
  string="abcd"
 
  echo ${#string} #输出 4
 
  提取子字符串
 
  以下实例从字符串第 2 个字符开始截取 4 个字符:
 
  string="runoob is a great site"
 
  echo ${string:1:4} # 输出 unoo
 
  查找子字符串
 
  查找字符 "i 或 s" 的位置:
 
  string="runoob is a great company"
 
  a="hello world"
 
  echo `expr index "$string" is`
 
  # 输出 8
 
  echo `expr index "$a" world`
 
  注意: 以上脚本中 "`" 是反引号,而不是单引号 "'",不要看错了哦。
 
  Shell 数组
 
  bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
 
  类似与C语言,数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。
 
  定义数组
 
  在Shell中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:
 
  数组名=(值1 值2 ... 值n)
 
  例如:
 
  array_name=(value0 value1 value2 value3)
 
  或者
 
  array_name=(
 
  value0
 
  value1
 
  value2
 
  value3
 
  )
 
  还可以单独定义数组的各个分量:
 
  array_name[0]=value0
 
  array_name[1]=value1
 
  array_name[n]=valuen
 
  可以不使用连续的下标,而且下标的范围没有限制。
 
  读取数组
 
  读取数组元素值的一般格式是:
 
  ${数组名[下标]}
 
  例如:
 
  valuen=${array_name[1]}
 
  使用@符号可以获取数组中的所有元素,例如:
 
  echo ${array_name[@]}
 
  获取数组的长度
 
  获取数组长度的方法与获取字符串长度的方法相同,例如:
 
  # 取得数组元素的个数
 
  length=${#array_name[@]}
 
  # 或者
 
  length=${#array_name[*]}
 
  # 取得数组单个元素的长度
 
  lengthn=${#array_name[n]}
 
  Shell 注释
 
  以"#"开头的行就是注释,会被解释器忽略。
 
  sh里没有多行注释,只能每一行加一个#号。只能像这样:
 
  #--------------------------------------------
 
  # 这是一个注释
 
  # author:菜鸟教程
 
  # site:菜鸟教程 - 学的不仅是技术,更是梦想!
 
  # slogan:学的不仅是技术,更是梦想!
 
  #--------------------------------------------
 
  ##### 用户配置区 开始 #####
 
  #
 
  #
 
  # 这里可以添加脚本描述信息
 
  #
 
  #
 
  ##### 用户配置区 结束 #####
 
  如果在开发过程中,遇到大段的代码需要临时注释起来,过一会儿又取消注释,怎么办呢?
 
  每一行加个#符号太费力了,可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。
 
  五、传递参数
 
  我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
 
  向脚本传递三个参数,并分别输出,其中 $0 为执行的文件名:
 
  #!/bin/bash
 
  echo "Shell 传递参数实例!";
 
  echo "执行的文件名:$0";
 
  echo "第一个参数为:$1";
 
  echo "第二个参数为:$2";
 
  echo "第三个参数为:$3";
 
  为脚本设置可执行权限,并执行脚本,输出结果如下所示:
 
  $ chmod +x test.sh
 
  $ ./test.sh 1 2 3
 
  Shell 传递参数实例!
 
  执行的文件名:./test.sh
 
  第一个参数为:1
 
  第二个参数为:2
 
  第三个参数为:3
 
  另外,还有几个特殊字符用来处理参数:
 
  参数处理
 
  说明
 
  $# 传递到脚本的参数个数
 
  $* 以一个单字符串显示所有向脚本传递的参数。
 
  如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
 
  $$ 脚本运行的当前进程ID号
 
  $! 后台运行的最后一个进程的ID号
 
  $@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
 
  如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
 
  $- 显示Shell使用的当前选项,与set命令功能相同。
 
  $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
 
  #!/bin/bash
 
  echo "Shell 传递参数实例!";
 
  echo "第一个参数为:$1";
 
  echo "参数个数为:$#";
 
  echo "传递的参数作为一个字符串显示:$*";
 
  执行脚本,输出结果如下所示:
 
  $ chmod +x test.sh
 
  $ ./test.sh 1 2 3
 
  Shell 传递参数实例!
 
  第一个参数为:1
 
  参数个数为:3
 
  传递的参数作为一个字符串显示:1 2 3
 
  $* 与 $@ 区别:
 
  相同点:都是引用所有参数。
 
  不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。
 
  #!/bin/bash
 
  echo "-- \$* 演示 ---"
 
  for i in "$*"; do
 
  echo $i
 
  done
 
  echo "-- \$@ 演示 ---"
 
  for i in "$@"; do
 
  echo $i
 
  done
 
  mkdir /tmp/vitest
 
  cd /tmp/vitest
 
  cp /etc/man.config .(注意这个英文状态下的点,表示当前路径)
 
  vi man.config
 
  :set nu 可以设置Vim行号
 
  58G移动到这个文件的第58行,40->表示向右移动40个字符
 
  GG=1G表示移动到第一行
 
  U回到文本最初状态,:q!不做修改退出
 
  ctrl +z我的vim会被丢到后台去执行
 
  ls -al展示所有文件
 
  kill -9 %1模拟断线停止Vim工作
 
  鳥哥的 Linux 私房菜 -- 第九章、vimq 程式編輯器
 

(编辑:均轻资讯网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章