Bash
赋值语法 foo=bar
,访问变量中存储的数值,其语法为 $foo
。使用空格分隔赋值语句,导致不能正常工作。在 Shell 脚本中使用空格会起到分割参数的作用。
# 此语句不能正常工作
foo = bar
Bash 中的字符串通过 '
和 ''
分隔符来定义。但含义却不同,
- 单引号
'
定义的字符串是原义字符串,其中的变量不会被转义。 - 双引号
''
定义的字符串会就变量值进行替换。
foo=bar
echo "$foo"
# 打印 bar
echo '$foo'
# 打印 $foo
参数
bash 使用了很多特殊变量表示参数、错误代码和相关变量。
$0
脚本名$1~$9
$1代表第1个参数,一次类推。$@
所有参数$#
参数个数$?
前一个命令到返回值$$
当前脚本进程识别码!!
上一条命令$_
上一条命令的最后一个参数STDOUT
返回输出值STDERR
返回错误及错误码
操作符
&&
和 ||
- 同一行的多个命令可以用
;
分隔 - 程序
true
返回码永远是0
- 程序
false
返回码永远是1
命令替换
以变量的形式获取一个命令的输出
$( CMD )
执行 CMD
命令,输出结果会替换掉 $( CMD )
bashuser~$ echo "We are in $(pwd)"
We are in /home/bashuser
进程替换
<( CMD )
会执行 CMD
并将结果输出到一个临时文件中,并将 <( CMD )
替换成临时文件名。
返回值会通过文件而不是 STDIN。
显示文件夹 foo
和 bar
中文件的区别。
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:
/etc/profile
~/.bash_profile
~/.bashrc
文件夹加入环境变量
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 -x
和 set +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
-
lsb_release -a
检查 linux 发行版本 -
cat /etc/shells
查询 linux 系统中的支持的 shell 类型 -
umask
查看用户掩码,系统为了保护用户创建文件和文件夹的权限,此时系统会有一个默认的用户掩码(umask),大多数的 linux 系统的默认掩码为 022。
用户掩码的作用:用户在创建文件时从文件的默认权限中减去掩码中的权限,默认权限(文件 0666,文件夹 0777)- umask
创建文件的权限为:0666 - 0022 = 0644
文件夹的权限为: 0777 - 0022 = 0755
-
umask -S
以符号的形式查看用户掩码-rw-r--r-- 12 linuxize users 12.0K Apr 8 20:51 filename.txt |[-][-][-]- [------] [---] | | | | | | | | | | | | | +-----------> 7. Group | | | | | +-------------------> 6. Owner | | | | +--------------------------> 5. Alternate Access Method | | | +----------------------------> 4. Others Permissions | | +-------------------------------> 3. Group Permissions | +----------------------------------> 2. Owner Permissions +------------------------------------> 1. File Type
r
(read) = 4w
(write) - 2x
(execute) = 1- no permissions = 0
In case you’re curious, this is how you would copy a file under WSL to your Windows clipboard:
cat report.txt | clip.exe