LinuxShell变量与传递数据使用

302 阅读2分钟

VsCode使用插件

  • shell-format(格式化插件)

补全插件为tabnine,目前遗留问题,函数无法如其他语言点击跳转

变量

变量类型

  • 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
  • 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
  • shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

声明变量

# /bin/bash
name="hello world"	# 声明变量 `=` 前后不能有空格!
echo "${name}"
# or
# echo "$name"
# 使用`${variable name}` or `$VariableName` 调用变量

只读变量

使用 readonly命令可以将变量定义为只读变量

# /bin/bash
readonly name="hello world"
name="test"
echo $name

output: line 3: name: readonly variable

删除变量

使用 unset可以删除变量

# /bin/bash
name="hello world"
unset name
echo $name

Tip:注意如果声明了只读变量会无法删除:unset: name: cannot unset: readonly variable

注意事项

  • 字符串问题

    • 单引号内不能包含变量,无法使用转义符
  • 查找字符串

    name="hello world"
    echo `expr index "$name" o`
    

    注意 expr index 为查询命令,必须带上

  • 数组

    • bash支持一维数组,不支持多维数组且没有数组长度限制,数组之间用空格分割

    # /bin/bash
    name=()
    name[0]="hello"
    name[1]="world"
    echo "list is :  ${name[1]}"
    
  • 多行注释

:<<EOF
注释内容...
注释内容...
注释内容...
echo "hello world"
EOF
echo "hello world"

后面的EOF可以自定义,随意更换,但结尾必须是定义的字符

传递参数

接受命令行所传递的参数

  • $# 获取传递参数的总数量
  • $* 以一个单字符串显示所有向脚本传递的参数。
    • 如:""用「"」括起来的情况、以"*"用「"」括起来的情况、以"1 22 … n"的形式输出所有参数。
  • $$ 脚本运行的当前进程ID
  • $! 后台运行的最后一个进程ID号
  • $@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
    • 如"@"用「"」括起来的情况、以"@"用「"」括起来的情况、以"1" "2""2" … "n" 的形式输出所有参数。
  • $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
  • $- 显示Shell使用的当前选项,与set命令功能相同。

注意事项

  • * 与 @ 区别:
    • 相同点:都是引用所有参数。
    • 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。