Skip to content

## Bash 赋值语法 `foo...

Updated: at 10:33

Bash

赋值语法 foo=bar,访问变量中存储的数值,其语法为 $foo 。使用空格分隔赋值语句,导致不能正常工作。在 Shell 脚本中使用空格会起到分割参数的作用。

# 此语句不能正常工作
foo = bar

Bash 中的字符串通过 ''' 分隔符来定义。但含义却不同,

foo=bar
echo "$foo"
# 打印 bar
echo '$foo'
# 打印 $foo

参数

bash 使用了很多特殊变量表示参数、错误代码和相关变量。

操作符

&&||

命令替换

以变量的形式获取一个命令的输出

$( CMD ) 执行 CMD 命令,输出结果会替换掉 $( CMD )

bashuser~$ echo "We are in $(pwd)"
We are in /home/bashuser

进程替换

<( CMD ) 会执行 CMD 并将结果输出到一个临时文件中,并将 <( CMD ) 替换成临时文件名。

返回值会通过文件而不是 STDIN。

显示文件夹 foobar 中文件的区别。

bashuser~$ diff <(ls foo) <(ls bar)

通配符

配置文件

Bash is the GNU shell, when the shell is started, it reads its configuration files. The most important are:

文件夹加入环境变量

export PATH="$PATH:~/scripts"

执行 shell 脚本

脚本应该具有执行权限,更改文件权限使用命令:

chmod +x script_name.sh
# 脚本所在的文件夹没有被加入环境变量时
./script_name.sh

# 指定特殊的 shell 执行脚本
sh script_name.sh

bash script_name.sh

这种执行方式会建立一个 subshell。脚本中的函数、变量和 aliases 只能在此 subshell 中访问到,当 subshell 退出并且父级 shell 获取到控制权后,脚本中所有的内容都会被清空,并且忘记脚本所做的更改。

如果你不想开始一个新的 shell 而是希望这个脚本在当前 shell 中被打开,你应该使用:

source script_name.sh

此命令不需要脚本具有执行权限,命令可以在当前环境中被执行。这时脚本中定义的变量,在当前环境中就可以被访问到。

$ source script.sh

Debugging Bash scripts

Debugging on the entire script

执行脚本的命令中,添加 -x 选项将会 debug 整个脚本文件

bash -x script_name.sh

Debugging on part(s) of the script

在脚本文件的某一命令行前后添加 set -xset +x 即可 debug 该命令行。

set -x  # activate debugging from here

set +x  # stop debugging from here

使用 echo 命令调试脚本

在你的代码中插入 echo 语句,这会帮助你辨别错误在哪里发生并且变量的值是什么

#!/bin/bash
echo "Value of variable x is: $x"

set -e option

通过使用 set -e 选项,在遇到错误时,脚本会立即结束执行。通过这种方式也可以帮助我们快速发现问题。

The Bash environment

Shell initialization files

/etc/profile

/etc/bashrc

You might also find that /etc/profile on your system only holds shell environment and program startup settings, while /etc/bashrc contains system-wide definitions for shell functions and aliases. The /etc/bashrc file might be referred to in /etc/profile or in individual user shell initialization files.

Individual user configuration files

~/.bash_profile

This is the preferred configuration file for configuration user environment individually. In this file, users can add extra configuration options or change default settings:

~/.bash_login

~/.bash_profile 不存在时,此文件会被读取

~/.profile

~/.bash_profile 和 ~/.bash_login 不存在时,此文件会被读取。

~/.bashrc

现在开发环境下,不需要登陆的 shell 是比较常见的,在这种 shell

中,用户不需要提供用户名和密码。此时 bash 会读取 ~/.bashrc 配置文件。

~/.bash_logout

Command line

In case you’re curious, this is how you would copy a file under WSL to your Windows clipboard:

cat report.txt | clip.exe