SHELL脚本随笔(一)
一、快速入门:编写Hello World脚本
#!/bin/bash echo 'hello world!'
运行:
# 方法1 sh hello.sh # 方法2 chmod +x hello.sh //需要脚本有执行权限 ./hello.sh
说明:
#!
告诉系统这个脚本需要什么解释器来执行。- 文件扩展名
.sh
不是强制要求的,只是为了方便使用 - 方法1 直接运行解释器,
hello.sh
作为 Shell 解释器的参数。此时 Shell 脚本就不需要指定解释器信息,第一行可以去掉。 - 方法2 hello.sh 作为可执行程序运行,Shell 脚本第一行一定要指定解释器。
- 还有其他解释器可供使用,后续补充
二、SHELL的基本语法
Shell脚本语言是弱类型语言(无须定义变量的类型即可使用)
Shell脚本的基本结构:
2.1 脚本头
每个Shell脚本都应该以#!/bin/bash
或#!/bin/sh
开头,这叫做脚本头(shebang),它告诉系统用哪种Shell来执行这个脚本。bash和sh是两种常见的Shell,它们有一些细微的差别,但大部分情况下是兼容的。
2.2 注释
注释是用来说明代码的意义或功能的文字,它不会被执行。在Shell脚本中,注释以#
开头,可以单独占一行,也可以跟在命令后面。例如:
# 这是一个注释
echo "Hello, world!" # 这也是一个注释
注意:以#
开头的行在Shell脚本中通常是注释,但当以#!
开头时,它的作用就不是注释了,而是指定了脚本应该由哪个解释器来执行,而且在Shell脚本中,#!
(shebang)行必须位于脚本的第一行,否则系统将不会将其视为解释器指令,而会将其视为普通的注释行。
2.3 Shell 变量
shell变量分为环境变量(全局变量)和普通变量(局部变量)
环境变量又可分为:自定义环境变量和bash内置变量
按照系统规范,所有环境变量的名字均采用大写形式
有一些环境变量,比如HOME、PATH、SHELL、UID、USER等,在用户登录之前就已经被/bin/login程序设置好了
变量
变量是用于存储数据值的名称。
变量名可以由字母(大小写敏感)、数字、下划线组成,不能以数字开头,避免使用shell关键字(如:if、then等),避免使用特殊符号和空格
普通变量:
三种定义写法:
name=value name='value' name="value"
这里的等号是赋值的意思;比较变量是否相等时也可以用“=”或“==”
$变量名表示输出变量,可以用$name和${name}两种用法,写法不同但使用效果一样
变量的输出方法如下:使用"$变量名"即可输出变量的内容,常用"echo $变量名"的方式,也可用printf代替echo输出更复杂的格式内容。
区别:
第一种写法:通常用于内容为连续的数字或字符串赋值场景
第二种写法:希望原样输出变量中的内容的场景,例如:a='$USER',使用echo $a,其输出结果为$USER
第三种写法:变量的内容很多时,如果有空格且希望解析内容中的变量的场景
为了安全和可预测性,建议使用双引号将内容包围,尤其是字符串变量,至于变量名暂时未定
把一个命令的结果作为变量的内容赋值的方法
- 变量名=`ls` #<==把命令用反引号引起来,不推荐使用这种方法,因为容易和单引号混淆
- 变量名=$(ls) #<==把命令用$()括起来,推荐使用这种方法(重要)
Shell中的特殊位置参数变量
$0、$1..$n、$#、$* 、$@
$0:取出执行脚本的名称(包括路径,若待执行脚本包含路径,也会打印路径)
dirname命令的作用是获取脚本的路径
basename命令的作用是获取脚本的名字
$n
$#:获取脚本传参的个数
$*:获取当前脚本的所有传参的参数,不加引号和$@相同,若给$*加上双引号,如:"$*",则表示将所有参数视为单个字符串,相当于"$1 $2 $3..."
$@:获取当前脚本的所有传参的参数,不加引号和$*相同,若给$*加上双引号,如:"$@",则表示将所有参数视为不同的独立字符串,相当于"$1", "$2", "$3" ...
测试 set -- "I am" chinese boy echo $# ----3 echo $1 ---- echo $2 echo $3 echo $* echo $@ echo "$*" echo "$@" ---- for i in $*;do echo $i;done for i in $@;do echo $i;done for i in "$*";do echo $i;done for i in "$@";do echo $i;done