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

 

 

 

posted @ 2024-01-04 12:46  黑大帅gs  阅读(7)  评论(0编辑  收藏  举报