shell 脚本学习

注:本文参考菜鸟教程;仅为个人学习笔记
#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。
#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。

echo 命令用于向窗口输出文本。

一、运行shell脚本的两种方式

1.作为可执行程序
chmod +x ./test.sh  #使脚本具有执行权限
./test.sh  #执行脚本---告诉系统说,就在当前目录找
2.作为解释器参数
/bin/php test.php #这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。
小案例

比如您在一个脚本里export $KKK=111 ,假如您用./a.sh执行该脚本,执行完毕后,您运行 echo $KKK ,发现没有值,假如您用source来执行 ,然后再echo ,就会发现KKK=111。因为调用./a.sh来执行shell是在一个子shell里运行的,所以执行后,结构并没有反应到父shell里,但是 source不同他就是在本shell中执行的,所以能够看到结果.
小测试
1 建立test.sh
#!/bin/bash
export s=/home/jboss/
2
执行命令: source test.sh
echo $s
结果输出: /home/jboss/

3 新开个shell
执行命令: ./test.sh
echo $s
结果: 没有输出s值
结论:
1、执行脚本时是在一个子shell环境运行的,脚本执行完后该子shell自动退出。
2、一个shell中的系统环境变量才会被复制到子shell中(用export定义的变量);
3、一个shell中的系统环境变量只对该shell或者它的子shell有效,该shell结束时变量消失(并不能返回到父shell中)。3、不用 export定义的变量只对该shell有效,对子shell也是无效的。

直接执行一个脚本文件是在一个子shell中运行的,而source则是在当前shell环境中运行的。
source可以让脚本影响它们的父shell环境,这和export去影响子shell环境相反.

二、shell变量

your_name="王朝"  #变量名和等号间无空格

命名规则

  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。

变量的使用

your_name="qinjx"
echo $your_name
echo ${your_name}  #花括号可以使解释器辨识变量的边界
#!/bin/sh
myUrl="https://www.runoob.com"
readonly myUrl #只读变量
unset myUrl  #删除变量 用unset命令 但不能删除只读变量
echo $myUrl

shell的变量类型

  • 局部变量-- 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
  • 环境变量–
  • shell变量–(既包括局部变量也包括换将变量)
shell字符串

字符串拼接

your_name="runoob"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting  $greeting_1
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2  $greeting_3
输出结果为:

hello, runoob ! hello, runoob !
hello, runoob ! hello, ${your_name} !

获取字符串长度及截取字符串

string="asdfg"
echo ${#string} #输出结果 5
echo ${string:1:4} #输出结果为sdfg

字符串查找

string="runoob is a great site"
echo `expr index "$string" io`  # 输出 4 查找i或o
echo `expr index "$string" a`  #输出 9

注意: 以上脚本中` 是反引号,而不是单引号',不要看错了哦。