Linux的Shell脚本1

shell启动流程

脚本启动时的home配置文件Linux是:

登录 shell 会话的启动文件

文件 内容

/etc/profile 应用于所有用户的全局配置脚本。

~/.bash_profile 用户私人的启动文件。可以用来扩展或重写全局配置脚本中的设置。

~/.bash_login 如果文件 ~/.bash_profile 没有找到,bash 会尝试读取这个脚本。

~/.profile 如果文件 ~/.bash_profile 或文件

~/.bash_login 都没有找到,bash 会试图读取这个文件。 这是基于 Debian 发行版的默认设置,比方说 Ubuntu。

非登录 shell 会话的启动文件

文件 内容

/etc/bash.bashrc 应用于所有用户的全局配置文件。

~/.bashrc 用户私有的启动文件。可以用来扩展或重写全局配置脚本中的设置。

Echo

echo含义:就是获取输入流并输出输出流。

要记得字符表达模式是最常见的,并且是最好用的,最容易的(但是相对而言也是最难掌握的)

例如 echo .[!..]* 意思就是说让隐藏文件,并且是开头是一个点的那种要被打印出来。

echo实现算术计算:

echo只支持整数的计算

  • 格式echo $((x + y))
  • +
  • -
  • *
  • /
  • % 余数
  • **
bash 复制代码
echo $(((3 ** 2)*12)
# 可以看出来空格并不是很重要关于shell

但是建议不要加空格,因为shell中空格很容易报错。

alias th = 'node'
# 报错,因为你在th和=中间加了空格这是不对的。

echo进行混合输出

bash 复制代码
echo 这个东西是 $((12 + 12)) 个

花括号{}

bash 复制代码
echo 这是{1..12}月。

这是1月 这是2月 这是3月 这是4月 这是5月 这是6月 这是7月 这是8月 这是9月 这是10月 这是11月 这是12月

basg 复制代码
echo 大叫好我是{托马斯,舒克,贝塔}
# 大家好我是托马斯 大家好我是舒克 大家好我是贝塔
  • 对比[1,2,3]:或者是1,或者是2或者是3

  • {1,2,3}将123全部利用上并不是随机关系。

  • echo a{A{1,2},B{3,4}}b ## aA1b aA2b aB3b aB4b 没错还可以进行嵌套。

小测试

创立从2010到2017年每月每天的文件夹。你们知道怎么用吗?

简述$

接下来的篇章会着重讲述这个$

举例子:

bash 复制代码
ls -l $(which cp)

## 也就是说 $充当了输入流,将which cp的内容传递给了ls,作为了ls的参数。

讨论 |$

  • | 也可以让前者的输出流作为流给后者但是无法让后者的东西给前者
  • 但是使用$ 就可以很好的避免了这个问题,因为$()就相当于函数的返回值一样,它在哪里都可以。
  • 说真的$的方式是要比流灵活的,但是流这种方式更加简洁更加行云流水只不过需要一些特定的规矩罢了。

""

我们讨论一下双引号

很多功能用法只能单纯的输出了,但是

单词分割,路径名展开, 波浪线展开,和花括号展开都将失效,然而参数展开($USER),算术展开(echo $((1 + 2))),和命令替换(echo $(cal)) 仍然执行

echo " ( ( 1 + 3 ) ) " e c h o " ((1 + 3))"echo " ((1+3))"echo"((1 + 3))"

其实这个参数展开就是使用 把系统自己设置的变量所表达的意思表达出来,就比如 U S E R 如果没有 把系统自己设置的变量所表达的意思表达出来,就比如USER如果没有 把系统自己设置的变量所表达的意思表达出来,就比如USER如果没有它就是一句话罢了,但是现在有了$所以它就不是一句话了是一个变量了。

如果你遇见 hello world.text文件你是不是很伤脑筋呢?因为当你echo hello world.text时系统会识别成两个文件 hello 和 world.text 所以说当我们使用双引号的时候就没有这个问题了。会忽略单词分割机制

bash 复制代码
mkdir "dd dd d"
#如果没有双引号就不会忽略单词分割机制就会创立三个文件夹
mkdir dd dd d

但是说实话,我还是觉得使用标准命名法可以省很多事情。切勿玩火装13呀骚年~!

单词分割机制 : 在单词中寻找空格,制表符,和换行符,并把它们看作 单词之间的界定符。这意味着无引用的空格,制表符和换行符都不是文本的一部分, 它们只作为分隔符使用

bash 复制代码
echo 1 \
> dd
1 dd
这里很明显 \ 就是把末尾的换行符给注释掉了所以这个话就可以换行写。
bash 复制代码
echo $(cal)
September 2017 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

echo "$(cal)"
   September 2017
Su Mo Tu We Th Fr Sa
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

为什么会有这么大的差别,因为当$把cal的数据输出流给echo的输入流时,没有""所以说它的参数或者是输入流就不是一个了,就是很多个了,因为没有""的情况下 空格就不是空格的意思了 是表示分隔符的含义了,然而第二个就不同,这些数据并没有字母分割原理,因为系统识别他们就是一个参数这之间只是单纯的空格和换行罢了,所以就是一个整体的大的输出流被传递给了echo的输入流。

单引号''

单引号是最厉害的,什么效果都没了

bash 复制代码
echo '$USER'

$USER

所以在实际中要灵活运用"" '' 和裸奔。

\

两个含义:

  • 转义(例如$ 这种在shell中表达特殊用法的词语)
  • 特殊用途

就如同上文中的\就是注释了末尾的换行符号,比如\\就是让无法输出的特殊符号顺利输出。

特殊用途的话:

  • \a 响铃("警告"-导致计算机嘟嘟响)
  • \b 退格符
  • \n 新的一行。在类 Unix 系统中,产生换行。
  • \r 回车符
  • \t 制表符

等等。

如果让这个转移符号其效果有两个方式

  • echo -e
  • echo something $'\a'

资料参考:https://github.com/0voice

相关推荐
微服务商城技术分享5 分钟前
通过Docker实现openGauss的快速容器化安装
运维·docker·容器
运维佬41 分钟前
在 Linux 系统上部署 Apache Solr
linux·apache·solr
编程墨客1 小时前
第03章 文件编程
linux·运维·服务器
命里有定数1 小时前
windows工具 -- 使用rustdesk和云服务器自建远程桌面服务, 手机, PC, Mac, Linux远程桌面 (简洁明了)
linux·运维·服务器·windows·ubuntu·远程工作
勤奋的凯尔森同学1 小时前
ubuntu22.04上手指南(更新阿里源、安装ssh、安装chrome、设置固定IP、安装搜狗输入法)
chrome·tcp/ip·ssh·ubuntu22.04·搜狗输入法·ubuntu24.04
cleveryuoyuo1 小时前
进程的程序替换exec*函数和shell实现
linux·服务器
运维佬1 小时前
nginx配置负载均衡详解
运维·nginx·负载均衡
爱编程的小金毛球球1 小时前
-bash: /home/xxx/anaconda3/bin/conda: No such file or directory
linux·conda·bash
Shepherd06192 小时前
【Jenkins实战】Windows安装服务启动失败
运维·jenkins
Biomamba生信基地3 小时前
Linux也有百度云喔~
linux·运维·服务器·百度云