(六)linux 学习 -- 从 shell 眼中看世界
The Linux Command Line 读书笔记 - 部分内容来自 http://billie66.github.io/TLCL/book/chap08.html
文章目录
每当你输入一个命令并按下 enter 键,bash 会在执行你的命令之前,对输入的字符完成几个步骤的处理。
字符展开 *
例如一个简单的字符序列”*”, 对 shell 来说有着多么丰富的涵义。这背后的的过程叫做(字符)展开。通过展开, 你输入的字符,在 shell 对它起作用之前,会展开成为别的字符。
最常见的通配符 * :
yiaz@yiaz-virtual-machine:~$ echo *
examples.desktop haha1.txt haha2.txt haha.txt h.txt myTxt2.txt myTxt.yaiz
new.txt sss.txt tee 公共的 模板 视频 图片 文档 下载 音乐 桌面
yiaz@yiaz-virtual-machine:~$
这里使用 echo 进行输出,我会发现 *,会被打印成当前目录下面的文件,而这正是通配符的含义。因此,可以发现 shell 在执行命令之前,会对命令进行特殊处理,这里做的是 字符展开。
路径名展开 *
yiaz@yiaz-virtual-machine:~$ echo ha*
haha1.txt haha2.txt haha.txt
yiaz@yiaz-virtual-machine:~$ ls ../*
examples.desktop haha.txt myTxt.yaiz tee 视频 下载
haha1.txt h.txt new.txt 公共的 图片 音乐
haha2.txt myTxt2.txt sss.txt 模板 文档 桌面
yiaz@yiaz-virtual-machine:~$ pwd
/home/yiaz
yiaz@yiaz-virtual-machine:~$ ls /home/*
examples.desktop haha.txt myTxt.yaiz tee 视频 下载
haha1.txt h.txt new.txt 公共的 图片 音乐
haha2.txt myTxt2.txt sss.txt 模板 文档 桌面
yiaz@yiaz-virtual-machine:~$ ls -d /home/*
/home/yiaz
yiaz@yiaz-virtual-machine:~$ echo [[:upper:]]*
[[:upper:]]*
yiaz@yiaz-virtual-machine:~$ echo [[:lower:]]*
examples.desktop haha1.txt haha2.txt haha.txt h.txt myTxt2.txt
myTxt.yaiz new.txt sss.txt tee
发现只要是特殊的标记,shell 都会做特殊处理,但是如果特殊处理以后,没有找到目标值,则 echo 会原样输出。
直接 * 路径名展开,不会打印出隐藏文件,如果想打印出隐藏文件,则可以使用 .* 这种模式,但是这样打印也不是完美的,会把 当前目录 . 和 上级目录 .. 的标记也打印出来。如果想完美的打印出隐藏文件,使用 ls -A 。
波浪线展开 ~
波浪线字符(“~”)也是有特殊的含义。当它用在一个单词的开头时,它会展开成指定用户的家目录名,如果没有指定用户名,则展开成当前用户的家目录。
yiaz@yiaz-virtual-machine:~$ echo ~
/home/yiaz
算术表达式展开 $(( ))
shell 在展开中执行算数表达式。这允许我们把 shell 提示当作计算器来使用。
算术表达式展开使用这种格式:$((算术表达式)) ,但是只支持整数运算
支持的操作:
| 操作符 | 说明 |
|---|---|
| + | 加 |
| - | 减 |
| * | 乘 |
| / | 除(但是记住,因为展开只是支持整数除法,所以结果是整数。) |
| % | 取余,只是简单的意味着,“余数” |
| ** | 取幂 |
支持括号优先级。
yiaz@yiaz-virtual-machine:~$ echo $(((2**4)+4*2))
24
花括号展开 { }
通过它,你可以从一个包含花括号的模式中 创建多个文本字符串。像下面这样:
yiaz@yiaz-virtual-machine:~$ echo email:{1255621959,10001,10002}.@qq.com
email:1255621959.@qq.com email:10001.@qq.com email:10002.@qq.com
yiaz@yiaz-virtual-machine:~$ echo Number_{1..5}
Number_1 Number_2 Number_3 Number_4 Number_5
其中 , 表示分隔,.. 表示一系列,.. 前后的内容需要一样,要么全是数字,要么全是字母,其中字母只能 A..Z 或者 a..z 不能 A..z 。
花括号展开模式可能包含一个开头部分叫做报头,一个结尾部分叫做附言。花括号表达式本身可 能包含一个由逗号分开的字符串列表,或者一个整数区间,或者单个的字符的区间 。但是不能嵌套空格进去,下面会讲为什么。
还可以嵌套:
yiaz@yiaz-virtual-machine:~$ echo A{s{Z..A},{a..z}}a
AsZa AsYa AsXa AsWa AsVa AsUa AsTa AsSa AsRa AsQa AsPa AsOa
AsNa AsMa AsLa AsKa AsJa AsIa AsHa AsGa AsFa AsEa AsDa AsCa
AsBa AsAa Aaa Aba Aca Ada Aea Afa Aga Aha Aia Aja Aka Ala
Ama Ana Aoa Apa Aqa Ara Asa Ata Aua Ava Awa Axa Aya Aza
参数展开 $参数名
可以直接查看系统变量的值。
yiaz@yiaz-virtual-machine:~$ echo $USER
yiaz
要想查看所有的变量可以使用:printenv | less 查看。
其中在其他展开那里,如果输入的展开项不对,则会提示错误,在参数展开这里,输入错误的展开项,不会得到错误提示,会得到一个空白输出。道理很简单,跟没找到对应的参数一样。
命令替换 $()
命令替换允许我们把一个命令的输出作为一个展开模式来使用:
yiaz@yiaz-virtual-machine:~$ echo $(ls)
examples.desktop haha1.txt haha2.txt haha.txt h.txt myTxt2.txt
myTxt.yaiz new.txt sss.txt tee 公共的 模板 视频 图片 文档 下载 音乐 桌面
这里把 ls 的输出,当做 echo 的输入了。
在旧版本的 shell 中,使用倒引号 `` 。
控制展开
前面已经讲了如何展开,以及利用展开,下面将控制展开,让它有时候不展开。
双引号
shell会做做特殊处理的字符,被双引号括起来以后,shell就不再做特殊处理。比如单词分隔(空格),以及上面讲的大部分字符。其中单词分隔,体现在我们输入多个单词的是,中间有一个或多个空格的时候,
shell会将其切割成中间全是一个空格。但是如果文件名有空格,命令在这种文件的时候,不使用双引号,就无法操作了。
也是由于单词分隔的问题,所有上面说的花括号展开,里面的分隔符不能用空格。但是有几个刺头,双引号也治不了,分别是下面三个
$ ,\以及倒引号 ` 。
单引号
- 如要禁止所有的展开,就使用单引号。
[me@linuxbox ~]$ echo text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER
text /home/me/ls-output.txt a b foo 4 me
[me@linuxbox ~]$ echo "text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER"
text ~/*.txt {a,b} foo 4 me
[me@linuxbox ~]$ echo 'text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER'
text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER
- 如要禁止所有的展开,就使用单引号。
转义字符
有时候想输出这些特殊字符,可以转移下,在他们前面添加一个 \ ,想使用反斜杠本身,则使用 \\:
yiaz@yiaz-virtual-machine:~$ echo "$((2**3))"
8
yiaz@yiaz-virtual-machine:~$ echo "\$((2**3))"
$((2**3))
yiaz@yiaz-virtual-machine:~$ echo \\
\
转义序列
反斜杠除了作为转义字符外,也可以构成一种表示法,来代表某种 特殊字符,这些特殊字符叫做控制码。ASCII 编码表中前32个字符被用来把命令转输到电报机 之类的设备。一些编码是众所周知的(制表符,退格符,换行符,和回车符),而其它 一些编码就不熟悉了(空值,传输结束码,和确认)。
| 转义序列 | 含义 |
|---|---|
| \a | 响铃(”警告”-导致计算机嘟嘟响) |
| \b | 退格符 |
| \n | 新的一行。在类 Unix 系统中,产生换行。 |
| \r | 回车符 |
| \t | 制表符 |
要想解释这些转义序列。echo 命令带上 ‘-e’ 选项,能够解释转义序列。或者把转义序列放在 $' ' 里面。
后记
看完以后,千万不要以为展开和 echo 有很大关系,他们没有关系,只是碰巧 echo 充当一个输出的角色,便于查看展开。
(六)linux 学习 -- 从 shell 眼中看世界的更多相关文章
- 从 shell 眼中看世界
(字符) 展开每一次你输入一个命令,然后按下 enter 键,在 bash 执行你的命令之前, bash 会对输入的字符完成几个步骤处理.我们已经知道两三个案例,怎样一个简单的字符序列,例如 “*”, ...
- Linux 学习 (八) Shell
Linux达人养成计划 I 学习笔记 Shell 是什么: Shell 是一个命令解释器 Shell 还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强 Shell 的分类: Bourne S ...
- linux 学习10 shell 基础
10.1 Shell概述 .Shell是什么 Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动.挂起.停止甚至是编写一 ...
- (原创)鸟哥linux学习script shell相关笔记
在使用鸟哥linux进行script shell学习的过程中碰到一些不太明白的知识点,在这里进行一些记录 1. [root@www scripts]# vi sh03.sh #!/bin/bash # ...
- (零)linux 学习 -- 从 shell 开始
The Linux Command Line 读书笔记 - 部分内容来自 http://billie66.github.io/TLCL/book/chap02.html 文章目录 前言 什么是 she ...
- Linux学习之Shell编程基础
转自:http://my.oschina.net/itblog/blog/204410 1 语法基本介绍1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来 ...
- Linux学习——自定义shell终端提示符
转自:here 我使用的Linux发行版是LinuxMint 17.2 Rafaela,默认情况下Terminal中的shell提示包括了用户名.主机名.当前目录(绝对路径)和提示符.这样会导致当进入 ...
- linux 学习随笔-shell基础知识
1:用户的shell历史命令保存在home/username/.bash_history中 #!! 执行用户的上一条命令 #!pw 执行命令历史中最近一次以pw开头的命令 2:'*'来匹配零或多个 ...
- linux学习总结----shell编程
## 环境变量 ## 全局变量 ``` 常见的全局环境变量 PATH 指令的搜索路径 HOME 用户的家目录 LOGNAME 登录名 SHELL 脚本的类型 使用全局环境变量 echo $PATH 自 ...
随机推荐
- Gift to XBACK(小小礼物)
什么白天 什么黑夜 我没有 准备着给你的 Surprise 你给我的爱 让我觉得已足够 是你让我相信爱会有 是你的爱陪我绕宇宙 打开日记本写下忧愁 你却让我看时间轴 我才知道现在我能看到的画面 拥有你 ...
- TCP BBR 从开启到关闭:以 Debian 9 为例
TCP BBR 从开启到关闭:以 Debian 9 为例 开启 执行如下命令: echo "net.core.default_qdisc=fq" >> /etc/sys ...
- Pollard-Rho算法求大数质因子
/* * 大整数分解到现在都是世界级的难题,但却是一个重要的研究方向,大整数在公共密钥的研究上有着重要的作用 * Pollard Rho算法的原理就是通过某种方法得到两个整数a和b.而待分解的大整数为 ...
- CSS3 之loading动画实现思路
效果大致如下: 主要实现方式: 该效果主要用到animation-timing-function中的steps()函数,该函数主要用于分步隐藏不同模块. 实现思路: 第一步动画: 第二步动画: 第三步 ...
- Vue.set 向响应式对象中添加响应式属性,及设置数组元素触发视图更新
一.为什么需要使用Vue.set? vue中不能检测到数组和对象的两种变化: 1.数组长度的变化 vm.arr.length = 4 2.数组通过索引值修改内容 vm.arr[1] = ‘aa’ Vu ...
- HTML盒子模型冷知识!!!
一.边框 1.边框颜色 border-color 边框颜色(可以设置上边框,如:border-top-color,也可以整体设置,但是要注意顺序) 2.边框粗细 bord ...
- Linux基础及常用指令
1.Linux目录结构 bin(usr/bin,user/local/bin) #存放常用指令,如cp.cat.chown等 sbin(usr/sbin,user/local/sbin) #高权限指令 ...
- 打印出js对象里面的内容
最近调试的时候遇到需要打印出js对象里面的内容,两种方式: 1.直接使用 JSON.stringify(obj) 方法把对象转成字符串,打印出来.但是因为维护的项目比较老,使用的还是ie11的ie5兼 ...
- windows 共享网络
windows 共享网络 今天单位的网络突然断了,光猫LOS亮红灯,宽带报修.等了半天还没来,下面科室要上报资料,急着用网, 通过windows的共享网络+无线网卡暂时用我的手机流量. 找了一台电脑插 ...
- 剑指offer:扑克牌顺子
题目描述: LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他 ...