关于shell脚本的一些笔记 Jimmy
脚本开头
#!/bin/sh#!/bin/bash
指定本脚本的解释路径。
脚本的执行方式
- source
- 直接执行脚本,sh script 或 ./srcipt
利用直接执行的方式执行脚本
此中方式运行的shell脚本只是在bash的子进程中运行,但脚本运行结束,子进程中的变量或者是各种操作,不会返回到父线程,也就是说,在子线程中设置的各种环境变量,定义的各种脚本变量会因为子进程的结束而消亡。./script.sh或者sh script.sh
有一个脚本script.sh,内容如下
在执行脚本前,尝试去读取read -p "Input Name: " nameecho -e ${name}
name变量的值,确认该变量不存在
以直接的方式运行脚本$ echo ${name}# <- 输出为空,变量不存在
退出脚本后,再读取$ ./script.shInput Name: chenchen # <- 输出变量name的内容
name变量的值,$ echo ${name}# <- 输出为空,此时name变量随着子进程结束而消亡
利用source来执行
还是执行相同的脚本,脚本运行结束后,再尝试读取name变量的值
因为$ source script.sh # 以source方式执行脚本Input Name: chen # 输入name变量的值chen # 脚本内部的echo$ echo ${name} # 脚本结束后,尝试读取chen # 显示变量的值
source会在父进程中执行脚本,会使脚本在整个系统中生效。
所以,想要使~/.bashrc生效的方式是source ~/.bashrc而不是sh ~/.bashrc
延时
sleep
默认是秒延时
sleep 0.5s // 延时0.5 ssleep 1s // 延时1 ssleep 1m // 延时1 minsleep 1h // 延时1 hoursleep 1d // 延时1 day
usleep
微秒延时
echo
- 回显shell脚本的字符串内容;
命令语法
$ echo [参数选项] [输出内容]
参数选项
-n : 带参数 -n 表示输出不换行;-e : 带参数 -e 表示可输出转义字符;
例程
不带参数 -n
$ echo "hello world"hello world
带参数 -n
$ echo -n "hello world"$
不带参数 -e
$ echo "hello world \r\n"hello world \r\n // 转义字符被当作字符输出
带参数 -e ```bash $ echo -e “hello world \r\n” hello world
$
<a name="h8T6b"></a>### 输出内容- **输出简单的字符串**echo 后无论带不带引号,对于输出字符串内容的效果是一样的。- 不带引号```bash$ echo hello world
带单引号
$ echo 'hello world'
带双引号
$ echo "hello world"
- 输出变量的内容
如果输出的内容是一个变量,那么引号的效果就不一样了。
- 带单引号
单引号会无视所有的特殊字符,全部当作普通的字符输出
$ echo '${USER}'
输出内容
${USER}
- 带双引号
双引号会解释 $ (美元符) \ (反斜杠) ` (反单引号,tab键上面那个按键),但是会忽视文件通配符 * 和 ?(这两个文件通配符用来模糊搜索文件)
$ echo "${USER}"
输出内容
hero
但是会忽视文件通配符
$ echo "*"
- 不带任何引号
会解释所有的符号,包括$ (美元符) \ (反斜杠) ` (反单引号,tab键上面那个按键)和文件通配符。其中,文件通配符会输出当前所在目录下的所有的文件夹。
$ echo ${USER} * $(date)
输出内容
$ echo ${USER} * $(date)hero Cpp Qt_Project Unix 2021年 05月 05日 星期三 11:59:32 CST// hero是当前的账号// Cpp Qt_Project Unix 是当前目录下的文件夹// 2021年 05月 05日 星期三 11:59:32 CST 是$(date)的结果
- 在shell中显示带颜色的字符
格式解析$ echo -e "\033[颜色1;颜色2m [要显示的字符串] \033[0m"
-e : 对转义字符生效\033[颜色1;颜色2m : 转义序列\033[ : 转义序列的开始,其中\033代表Esc符号,也可以使用\E或\e来代替颜色1和颜色2 : 表示字体的前景色或背景色,至于颜色1和颜色2哪一个表示前景色,哪一个表示背景色,由其设定的数值来决定,前景色和背景色的数值空间是不同的m : 转义序列的终止标志\033[0m : 表示将颜色恢复回原来的配色
<br />颜色列表:
| 色彩 | 黑 | 红 | 绿 | 黄 | 蓝 | 洋红 | 青 | 白 |
|---|---|---|---|---|---|---|---|---|
| 前景色 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 |
| 背景色 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 |
gnome-terminal
在脚本可以通过 gnome-terminal 命令直接打开一个终端。
命令语法
$ gnome-terminal [选项操作]
选项操作
--window : 打开一个新的终端窗口,--window --windown 可打开2个--tab : 在当前终端中打开一个新的页--maximize : 打开终端后窗口最大化--full-screen : 打开终端后窗口全屏--title="new title" : 给打开的窗口或者页命令--geometry=80x25+10+10 : 打开终端并设置大小和位置
read
shell利用 read 函数来读取用户的输入,用以实现shell与用户的交互过程。
命令语法
$ read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
参数说明
-a : 后面需跟随一个变量aname,其中aname被认为是个数组,数组元素以空格隔开;-d : 指定读取行的结束符号。默认结束符号为换行符。-n : 限制读取N个字符就自动结束读取,如果没有读满N个字符就按下回车或遇到换行符,则也会结束读取。-N : 严格要求读满N个字符才自动结束读取,即使中途按下了回车或遇到了换行符也不结束。其中换行符或回车算一个字符。-p : 给出提示符。默认不支持"\n"换行,要换行需要特殊处理,见下文示例。例如,-p "请输入密码:"-r : 禁止反斜线的转义功能。这意味着"\"会变成文本的一部分。-s : 静默模式。输入的内容不会回显在屏幕上。-t : 等待输入超时事件,跟随一个等待时间;-u : 从给定文件描述符(fd=N)中读取数据。
例程
-a
$ read -a array_list
输出数组
$ echo ${array_list[0]} // 输出数组的第一个元素$ echo ${array_list[@]} // 输出数组
-p
$ read -p "Please Input" input_var
输出输入的内容
$ echo ${input_var}
date
date用来获取或者设置时间。在shell里调用date可显示当前的系统时间。
$echo $(date)
输出内容
2021年 05月 09日 星期日 15:55:24 CST
命令语法
$ date [选项] ... [+格式]
选项
-d 字符串 : --date=字符串,显示给定<字符串>描述的时间,而非“当前时间”。最多4位,xx:xx:00;-r 文件名 : --reference=文件名,显示指定<文件名>的最后修改时间;-s 字符串 : --set=字符串,按照给定<字符串>描述的时间来设置时间
格式
使date以给定的格式输出。
$ date +"%a"
%% 一个文字的 %%a 当前locale 的星期名缩写(例如: 日,代表星期日)%A 当前locale 的星期名全称 (如:星期日)%b 当前locale 的月名缩写 (如:一,代表一月)%B 当前locale 的月名全称 (如:一月)%c 当前locale 的日期和时间 (如:2005年3月3日 星期四 23:05:25)%C 世纪;比如 %Y,通常为省略当前年份的后两位数字(例如:20)%d 按月计的日期(例如:01)%D 按月计的日期;等于%m/%d/%y%e 按月计的日期,添加空格,等于%_d%F 完整日期格式,等价于 %Y-%m-%d%g ISO-8601 格式年份的最后两位 (参见%G)%G ISO-8601 格式年份 (参见%V),一般只和 %V 结合使用%h 等于%b%H 小时(00-23)%I 小时(00-12)%j 按年计的日期(001-366)%k 小时,空格补充空白位( 0..23);与 %_H 相同%l 小时,空格补充空白位( 1..12);与 %_I 相同%m 月份(01..12)%M 分钟(00..59)%n 换行%N 纳秒(000000000..999999999)%p 当前地区时间设置中 AM 或 PM 的等效值(“上午”或“下午”),未知则为空%P 类似 %p,但使用小写%q 一年中的季度(1..4)%r 当前地区时间中十二小时制钟表时间(例如,下午 11时11分04秒)%R 24 小时制的时间和分钟;和 %H:%M 相同%s 1970-01-01 00:00:00 UTC 以来的秒数%S 秒(00-60)%t 输出制表符 Tab%T 时间,等于%H:%M:%S%u 星期,1 代表星期一%U 一年中的第几周,以周日为每星期第一天(00-53)%V ISO-8601 格式规范下的一年中第几周,以周一为每星期第一天(01-53)%w 一星期中的第几日(0-6),0 代表周一%W 一年中的第几周,以周一为每星期第一天(00-53)%x 当前locale 下的日期描述 (如:12/31/99)%X 当前locale 下的时间描述 (如:23:13:48)%y 年份最后两位数位 (00-99)%Y 年份%z +hhmm 数字时区(例如,-0400)%:z +hh:mm 数字时区(例如,-04:00)%::z +hh:mm:ss 数字时区(例如,-04:00:00)%:::z 数字时区带有必要的精度 (例如,-04,+05:30)%Z 按字母表排序的时区缩写 (例如,EDT)
例程
-d / —date
$ date -d 2222或$ date --date=2222
输出内容
2021年 05月 09日 星期日 22:22:00 CST
部分格式举例
$ date +"%B %d %H %M"
输出内容
五月 09 16 37
