随便学一学 Shell 脚本 -- 1. 变量

119 阅读3分钟

理解

shell 脚本可以理解为由程序帮我们在命令行中敲命令。敲命令的逻辑,顺序由shell脚本决定

注释

单行注释

在shell脚本中可以使用 # 来注释,类似js中的 //

# 这是一个注释

多行注释

多行注释以:<<'注释内容'和注释内容后跟的结束标记来表示。例如:

:<<'COMMENT'
这是多行注释
这是多行注释
这是多行注释
COMMENT

变量

变量直接写就好,没有定义的过程,当我们需要给一个变量赋值的时候就直接写变量名=值,当我们需要读取某个变量的值的时候就需要用$变量的形式读取

# 给变量var赋值
var=12
# 打印var的值
echo $var

这将会打印 12
echo 是一个命令,会输出参数值,可以尝试在终端中输入 echo message 将会输出message

只读变量

只读变量是指不能被修改的变量 看声明方式

var=12
# 将变量变成只读变量
readonly var

如果给只读赋值将会报错

删除变量

unset

var=12
# 删除var
unset var

变量类型

局部变量

局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。

换句话说就是在shell脚本 运行的时候定义的,只在脚本运行期间生效,当shell脚本运行结束之后,这些变量将会直接被释放。在shell脚本中,可以使用 local 关键字将变量声明为局部变量。 local 只能在函数中使用

demoFun(){
     str=123;
    echo "我是一个函数"$str
}
demoFun
# 函数外面也能访问,因为函数内部定义的str是一个shell变量
echo $str;

打印

是一个函数123
123

如果只想让str在函数内部生效,那么就加local关键字,表示str是一个局部变量

shell变量

shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行。

换句话说,在shell脚本执行期间都能访问的变量,可能是自己定义的变量,也可能是环境变量

环境变量

所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。

使用 export 将shell脚本的变量变为环境变量

Shell 字符串

字符串可以用""双引号表示,也可以用单引号表示,两者有如下区别

  • 单引号中的内容会被原样输出,不会进行变量替换和转义字符的转换。例如, echo 'hello $USER'会输出hello $USER,而不是hello和当前用户的用户名。
  • 双引号中的内容会进行变量替换和转义字符的转换。例如,echo "hello $USER"会输出hello和当前用户的用户名。
  • 双引号中可以使用 $()或``来执行命令,并将命令的输出结果嵌入到字符串中。例如,echo "The date is $(date)"会输出The date is和当前日期。双引号中可以使用反斜杠来转义特殊字符,例如表示换行符。而单引号中的反斜杠只是一个普通的字符,不会进行转义。

因此,如果需要进行变量替换或者嵌入命令输出结果,应该使用双引号。如果不需要进行变量替换或者转义字符的转换,应该使用单引号。

# 单引号中的内容会被原样输出,不会被解析
echo 'Hello $USER, today is $(date)'

# 双引号中的内容会被解析,可以包含变量和命令替换
echo "Hello $USER, today is $(date)"

字符串拼接

可以使用双引号或者单引号来拼接字符串。使用双引号可以在字符串中使用变量和命令替换,而使用单引号则不会解析其中的内容。以下是两种方式的示例代码:

str1="Hello"
str2="World"
result="$str1 $str2"
echo $result

使用双引号拼接字符串:

str1='Hello'
str2='World'
result=$str1' '$str2
echo $result

字符串长度

可以使用${#string}来获取字符串的长度,其中string是要获取长度的字符串变量。以下是示例代码:

str="Hello World"
echo ${#str}

输出结果为11,因为字符串中有11个字符。

子串

可以使用${string:position:length}来获取字符串的子串,其中string是要获取子串的字符串变量,position是子串的起始位置(从0开始),length是子串的长度。以下是示例代码:

echo ${"abcdefg":1:5}

这将输出 bcdef

Shell 数组

在Shell中,可以使用以下语法来定义数组:

array_name=(value1 value2 ... valuen)

其中,array_name 是数组的名称,value1value2、...、valuen 是数组中的元素。

例如,定义一个包含三个元素的数组:

my_array=(apple banana orange)

也可以使用下标来访问数组中的元素,例如:

echo ${my_array[0]}  # 输出:apple
echo ${my_array[1]}  # 输出:banana
echo ${my_array[2]}  # 输出:orange

可以使用 ${#array_name[@]} 来获取数组的长度,例如:

echo ${#my_array[@]}  # 输出:3

可以使用 ${array_name[@]} 来获取数组中的所有元素,例如:

echo ${my_array[@]}  # 输出:apple banana orange

也可以使用 ${array_name[*]} 来获取数组中的所有元素,例如:

echo ${my_array[*]}  # 输出:apple banana orange

以上就是Shell中定义数组的方法和常用操作。