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}。这种写法可以用于变量名与其他字符连用的情况。

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容