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
  1. 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

你可能感兴趣的:(Bash基本语法-学习笔记)