Shell 入门系列 (一): 变量

变量

shell 中的变量是弱类型的, 可以像PHP 中一样去使用, 和PHP变量的区别在与 函数中的变量默认为全局变量. 同时还有环境变量的概念.
shell 脚本执行时, 可以向脚本中传入变量

变量定义

  • 定义方式: 等号旁边不能有空格
  • 变量名: 变量名只能包含英文字母/数字/下划线, 变量名不能以数字开头, 不能使用bash里的关键字
    #!/bin/sh
    #定义变量
    name='michael'
    age=18
    #只读变量, 变量值不能被修改, 修改则报错
    readonly gender='男'
    #变量使用, 加花括号是为了识别变量边界, 如字符串拼接等 skill=Java  echo '${skill}Script'
    echo $name
    echo ${age}
    #变量销毁, unset 不能删除只读变量,会报错
    unset age
    unset gender
    echo $age
    #变量修改
    name='handsome'

变量类型

shell 中的变量类型有三种: 字符串, 数字, 数组

1. 字符串

字符串有单引号和双引号两种, 和PHP类似. 双引号里可以有变量和转义字符.

字符串变量定义

#!/bin/sh
#使用单引号定义一个字符串变量,  会原样输出 hello $name
name='michael'
str1='hello $name'
echo $str1
#使用双引号定义一个字符串变量, 会输出 hello michael
str2=''hello $name"
echo $str2
  • 字符串操作

2. 数字

3. 数组

数组的定义

数组的定义: array_name=(value0 value1 value2 value3)

#!/bin/sh
#定义一个数组
my_skill=('php' 'laravel' 'mysql' 'linux' 'html/css' '其他技术')
# 列出 /etc 下的文件和文件夹,当做数组赋值给etc_file 变量, 并遍历数组
etc_files=`ls /etc`
for f in $etc_files; do
  echo $f
done
## 上面例子可以使用 for file in $(ls /etc)
# 数组的使用 todo

数组的操作

#!/bin/sh
#定义一个数组
my_skill=('php' 'mysql' 'redis' 'linux' 'javascript' 'html' '其他技能')
#遍历数组
for k in ${my_skill[*]};
do
  echo $k
done

#读取数组元素
echo '数组中的第一个元素为:'${my_skill[0]}
#修改数组第一个元素(也可以使用此方法增加元素)
my_skill[0]='php7'
#获取数组的所有元素, 以字符串显示
echo '修改后的my_skill数组(以字符串显示)为:'${my_skill[*]}
#数组增加新元素
my_skill+=('laravel')
echo '修改后的my_skill数组(以字符串显示)为:'${my_skill[*]}

变量的作用域

变量的作用域(scope), 表示变量的生效范围

1. 环境变量

#!/bin/sh
# 系统的环境变量 /etc/profile
echo $PATH;
#子进程中可以使用的变量

2. shell 脚本变量

脚本内定义的变量, 退出即销毁

例1: 函数外调用函数内定义的变量

#!/bin/sh
#函数外调用函数中定义的变量
first_func()
{
    # 定义或重新赋值一个全局变量, 函数执行后这个变量在函数外部可用
    a=1
    # 设置一个函数内部的局部变量
    local b=2
}
first_func
echo $a
# 以下没有输出
echo $b

输出 1

例2: 函数内调用函数外定义的变量

#!/bin/sh
# 函数外调用函数中定义的变量
second_func()
{
    # 设置一个局部变量
    local b=2
    echo $b
}
b=3
second_func
echo $b

输出 2 3

脚本外的变量

运行shell 命令时, 附带的参数
运行 ./a.sh 'hello world' 'michael'

#!/bin/sh
# 脚本执行命令中附带的参数
echo '脚本的文件名:'$0
echo '脚本外的第一个参数:'$1
echo '脚本外的第二个参数:'$2
echo '脚本的参数个数:'$#
echo '向脚本传递的所有参数,字符串显示:'$*
echo '当前运行脚本的id号:'$$
echo "$@"

输出:

脚本的文件名:/usr/local/sh/test.sh
脚本外的第一个参数:hello world
脚本外的第二个参数:michael
脚本的参数个数:2
向脚本传递的所有参数,字符串显示:hello world michael
当前运行脚本的id号:10087
hello world michael
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!