bash 的变量和参数

对一个编程脚本来说,最最基础的当然是变量。

对大多数开发者来说,变量也是最不值得的大说特说的。

bash 里的变量有一些特别的地方值得说说,谨防跌坑。

基本行为

赋值

# 赋值
keng = '坑' # 等号两边空格?
variableName="value"
a='1'
b= # 空

echo $a;
echo $b; # b 和下面根本没出现过的 c 的区别?
echo $c;

等号两边空格?

我的 bash 生涯第一坑。bash 中,赋值 = 两边不能有空格。 有空格又会怎样?

VARIABLE =value
# 脚本将会尝试运行带参数 "=value" 的 "VARIABLE " 命令。

VARIABLE= value
# 脚本将会尝试运行 "value" 命令,同时设置环境变量 "VARIABLE" 为 ""。

上面 $b$c 的区别?

实际应用的角度来说,基本没区别,都是空值。技术的角度加以区别的话,如下:

```bash
if [ -z "$b" -a "${bxxx}" = "xxx" ] # 这里的判断会有单独的文章介绍
then
    echo 'b is set but empty'; # 设置但为空
else
    echo 'b is not set'; # 没设置,如 c
fi
```

变量中的空格

e=1 2 3 # 报错,变量中间当然不能有空格
e='1 2 3';
f='1  2   3';
echo $e; # 1 2 3
echo $f; # ?
echo "$f"; # ?

上述最后两行的结果?

echo $f; # '1 2 3'
echo "$f"; # '1  2   3',空格会保留。

如果在变量中出现空格,那么必须进行引用。

命令替换

命令替换就是将一个命令的结果赋值给变量。

g=`echo hello`
h=$(echo hello) # 这两种语法等价

i=`ls -l`
echo $i;
echo "$i"; # 和上一行的不同?想想上面的空格

替换

bash 里面引用一个变量的过程称为 Variable Substitution,字面意思即为变量替换。和大多数的语言叫法不同,但实际用起来没啥区别。

其实上面的赋值就有不少替换了,这里我们更进一步。

# 替换,必须有美元符号
variableName="value"
a='1'
b=

echo $variableName; # value
echo $a; # 1
echo ${a} # 1   实际上 $variable 是 ${variable} 的简化形式。
echo $b; #
echo foo $a;
echo 'foo $a'; # ? 单引号,强引用,所有字符字面量显示
echo "foo $a"; # ? 双引号,弱引用,变量会被替换
echo "foo \$a"; # ? 转义,变量不会被替换

变量类型

这里当然不是说字符串、整形什么的,其实 bash 中的变量都可以理解为字符串。 bash 中有四种类型的变量,它们是环境变量、本地变量、位置变量和特殊变量。

环境变量

参看维基百科的环境变量,这里不做赘述。

本地变量

我们上面的那么多的例子其实就是本地变量。 本地变量的作用域为当前脚本。有一个子类,局部变量,作用域是当前代码块,比如函数中的变量。

位置变量

其实就是我们说的参数了,也是特殊变量的一种,因为常用,单独拿出。

$n # n 为自然数,1、2、3……

# 实例
./test.sh foo bar
echo $1; # foo
echo $2; # bar

大于 $9 的参数必须被放在大括号中

echo "${10}"

特殊变量

变量

含义

$$

表示当前 Shell 进程的 ID ,即 pid

$n

上述位置变量

$#

传递给脚本或函数的参数个数

$*

传递给脚本或函数的所有参数

$@

传递给脚本或函数的所有参数 ? 见下方

$?

上个命令的退出状态,或函数的返回值 ? 见下方

$0

当前脚本的文件名

$*$@ 的区别

echo $*;
echo $@;  
# 没有双引号,两者一样,都以"$1" "$2" … "$n" 的形式输出所有参数

echo "$*";
# 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数

echo "$@";
# 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数

退出与退出状态

请查看退出与退出状态

参考文章

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏吴伟祥

Shell脚本学习总结(二) 流程控制 转

Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:

542
来自专栏岑志军的专栏

Swift-单例

1685
来自专栏三木的博客

Linux shell 程序设计5——shell中一些特殊符号的用法总结

1、{} 大括号: eg: ls my_{finger,toe}s 这条命令相当于如下两个命令的组合: ls my_fingers ; ls my_toes e...

1676
来自专栏北京马哥教育

awk学习笔记

awk是一种模式扫描和处理工具,相对于grep的查找,sed的编辑,它在对数据进行分析生成报表时显得尤为强大。awk通过逐行遍历一个或多个 文件的方式,查找模...

2686
来自专栏Petrichor的专栏

python: 将列表中的字符串 连接成一个 长路径

  今天实习公司分配了一个数据处理的任务。在将列表中的字符串连接成一个长路径时,我遇到了如下问题:

582
来自专栏雨过天晴

原 PHPStrom 9系列激活码

1504
来自专栏嵌入式程序猿

freeRTOS任务创建

我们曾经在公众号里给大家推送过关于freeRTOS在NXP kinetis KV4x上的移植,得到了猿友大量的反馈,很多猿友还是感觉对基础的一些东西不懂,今天我...

3347
来自专栏编程

判断字符长度小技巧

很多人在判断字符长度的时候总会有一些疑问,到底这个算不算字符,各种转义字符,十进制,十六进制等等。这里教大家一些判断的小技巧: C语言——字符串长度的计算方法 ...

16510
来自专栏程序员的知识天地

Python3 错误和异常

作为Python初学者,在刚学习Python编程时,经常会看到一些报错信息,在前面我们没有提及,这章节我们会专门介绍。

722
来自专栏python小白到大牛

零基础学习python编程不可错过的学习总结,小白福利!

通过以上可以看到我们写的很贱的程序随便保存了一个.txt结尾的格式,竟然也执行了,并没有按照统一要求的.py格式来设计, 那是不是说明后缀名可以说是任意的呢?理...

1213

扫码关注云+社区