Bash基本语法-学习笔记
1.变量
1.1 环境变量
HOME:用户的主目录。
HOST:当前主机的名称。
TERM:终端类型名,即终端仿真器所用的协议
USER:当前用户的用户名。
echo $LANG
打印结果:
zh_CN.UTF-8
echo $PATH
打印结果:
/Users/xjk/flutter/bin:/Users/xjk/.npm-global/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin:/Users/xjk/bin
echo $PWD
打印结果:
/Users/xjk
1.2 自定义变量
变量名必须遵守下面的规则。
- 字母、数字和下划线字符组成。
- 第一个字符必须是一个字母或一个下划线,不能是数字。
- 不允许出现空格和标点符号。
2.创建变量
variable=value
等号左边是变量名,右边是变量。注意,等号两边不能有空格。
如果变量的值包含空格,则必须将值放在引号中。
myvar="hello world"
a=z # 变量 a 赋值为字符串 z
b="a string" # 变量值包含空格,就必须放在引号里面
c="a string and $b" # 变量值可以引用其他变量的值
d="\t\ta string\n" # 变量值可以使用转义字符
e=$(ls -l foo.txt) # 变量值可以是命令的执行结果
f=$((5 * 7)) # 变量值可以是数学运算的结果
3.变量赋值
foo=1
foo=2
echo $foo
2
4.读取变量
读取变量的时候,直接在变量名前加上$就可以了
foo=2
echo $foo
每当 Shell 看到以$开头的单词时,就会尝试读取这个变量名对应的值。
如果变量不存在,Bash 不会报错,而会输出空字符。
由于$在 Bash 中有特殊含义,把它当作美元符号使用时,一定要非常小心,
echo $the book is $100.0
book is .0
需要输出美元符合时$,需要在$前面加\进行转义:
echo $the book is \$100.0
book is $100.0
读取变量的时候,变量名也可以使用花括号{}包围,比如{a}。这种写法可以用于变量名与其他字符连用的情况。
a=foo
echo $a_file #会将"a_file"解释为变量
打印结果:
echo ${a}_file
打印结果:
foo_file
变量名a_file不会有任何输出,因为 Bash 将其整个解释为变量,而这个变量是不存在的。只有用花括号区分$a,Bash 才能正确解读。
事实上,读取变量的语法$foo,可以看作是${foo}的简写形式。
如果变量的值本身也是变量,可以使用${!varname}的语法,读取最终的值。
myvar=USER
echo ${!myvar}
echo ${myvar=USER}
如果变量值包含连续空格(或制表符和换行符),最好放在双引号里面读取。
a="1 2 3"
echo $a
#打印结果:我电脑上测试后面的2个空格能正常输出
1 2 3
echo "$a"
打印结果:
1 2 3
5.删除变量
a="1 2 3"
echo $a
1 2 3
unset a
echo $a
这个命令不是很有用。因为不存在的 Bash 变量一律等于空字符串,所以即使unset命令删除了变量,还是可以读取这个变量,值为空字符串。
所以,删除一个变量,也可以将这个变量设成空字符串。
a="1 2 3"
a=
echo $a
6.输出变量
用户创建的变量仅可用于当前 Shell,子 Shell 默认读取不到父 Shell 定义的变量。为了把变量传递给子 Shell,需要使用export命令。这样输出的变量,对于子 Shell 来说就是环境变量。
export命令用来向子 Shell 输出变量。
export NAME=foo
#新建子shell
bash
The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050.
bash-3.2$ echo $NAME
foo
#修改继承的变量值
NAME=baz
#退出
exit
#读取NAME的值
echo $NAME
foo
7.特殊变量
Bash 提供一些特殊变量。这些变量的值由 Shell 提供,用户不能进行赋值。
(1)$?
$?为上一个命令的退出码,用来判断上一个命令是否执行成功。返回值是0,表示上一个命令执行成功;如果不是零,表示上一个命令执行失败。
ls doesnottexist
ls: doesnottexist: No such file or directory
echo $?
1
上面例子中,ls命令查看一个不存在的文件,导致报错。$?为1,表示上一个命令执行失败。
(2)$$
$$为当前 Shell 的进程 ID。
$$
zsh: command not found: 5229
这个特殊变量可以用来命名临时文件。
LOGFILE=/tmp/output_log.$$
echo $LOGFILE
/tmp/output_log.5229
(4)$!
$!为最近一个后台执行的异步命令的进程 ID。
#查看后台异步进程
echo $!
0
#开启后台命令
firefox &
[1] 5629
zsh: command not found: firefox
[1] + 5629 exit 127 firefox
#再次查看后台异步命令进程
echo $!
5629
(5)$0
$0为当前 Shell 的名称(在命令行直接执行时)或者脚本名(在脚本中执行时)。
echo $0
-zsh
(6)$-
$-为当前 Shell 的启动参数。
echo $-
569JNRXZghiklms
(7)#
$# 表示脚本的参数数量,$@表示脚本的参数值.
8.readonly命令
readonly命令等同于declare -r,用来声明只读变量,不能改变变量值,也不能unset变量。
readonly foo=1
foo=2
//打印结果:
zsh: read-only variable: foo
- let 命令
let命令用于将算术运算的结果,赋予一个变量。
let num=2+3
expr $num
打印结果:
5
注:num=2+3这个式子里面不能有空格,否则会报错
- 清屏操作
Ctrl + L或者
clear
- 自动补全
当命令输入到一半的时候,可以按一下 Tab 键,Readline 会自动补全命令或路径。比如,输入cle,再按下 Tab 键,Bash 会自动将这个命令补全为clear。
如果符合条件的命令或路径有多个,就需要连续按两次 Tab 键,Bash 会提示所有符合条件的命令或路径。 - 操作历史
$ history
此命令会输出这个文件的全部内容。用户可以看到最近执行过的所有命令,每条命令之前都有行号。越近的命令,排在越后面。
....
1620 cd
1621 ls
1622 desktop