Linux学习第九周笔记
内容搬运自蒋老师的ppt
¶变量的赋值及使用
¶bash变量
- 存储的内容
- 字符串
- 在执行过程中内容可以被修改
- 变量名
- 第一个字符必须为字母
- 其余字符可以是字母,数字,下划线
¶变量的赋值与引用
-
赋值与引用
1
2addr=20.1.1.254
ftp $addr注意:赋值作为单独一条命令,等号两侧不许多余空格
引用addr变量的方法: $addr 或 ${addr}1
2echo ${addr}A
echo $addrA命令行中含有$符的变量引用,shell会先完成变量替换
-
赋值时有空格特殊字符,需要加引号
1
2unit="Beiyou University"
echo $unit -
引用未定义变量,变量值为空字符串
¶shell内部开关
- set -u 当引用一个未定义的变量时,产生一个错误
- set +u 当引用一个未定义的变量时,认为是一个空串(默认情形)
- set -x 执行命令前打印出shell替换后的命令及参数,为区别于正常的 shell输出,前面冠以+号
- set +x 取消上述设置
¶echo
-
语法和功能
echo arg1 arg2 arg3 … 打印各命令行参数,每两个间用一空格分开,最后打印换行符 -
不可打印字符(转义):Linux需加选项-e,(不同UNIX间兼容性差)
- echo支持C语言字符串常数描述格式的转义和\c
- \c 打印完毕,不换行
- \b 退格
- \n 换行
- \r 回车
- \t 水平制表
- \ 反斜线
- \nnn 八进制描述的字符ASCII码
- 举例
1
2
3
4echo Beijing China #只打印一个空格
echo "Beijing China" #多个空格
echo –e '\065' #打印5
echo -e "\\r$cnt \\c"
¶命令printf
命令printf,用法与C函数printf类似,例如:
1 | printf '\033[01;33mConnect to %s Network\n' $proto |
¶在脚本中编辑文件
¶read 读用户的输入
-
内部命令read:变量取值的另外一种方法
- 从标准输入读入一行内容赋值给变量
- 例:读取用户的输入,并使用输入的信息。
1
2
3$ read name ccp.c
$ echo $name ccp.c
$ ls -l $name -rw-r--r-- 1 jiang usr 32394 May 27 10:10 ccp.c- 可将read写入.sh文件执行,获取输入
¶环境变量
¶环境变量和局部变量
- 默认类型
所创建的shell变量,默认为局部变量 - 局部变量转换为环境变量
export proto
- 局部变量和环境变量
- shell启动的子进程继承环境变量,不继承局部变量
- 子进程对环境变量的修改,不影响父进程中同名变量 (环境变量的设置,如PATH,CLASSPATH,LANG,如果必要的话 放在~/.bashrc中或/etc/profile中)
¶系统环境变量
- 创建
- 登录后系统自动创建一些环境变量影响应用程序运行
- HOME:用户主目录的路径名
- PATH:命令查找路径
- 与DOS/Windows不同的是,它不首先搜索当前目录
PATH=/bin:/usr/bin:/etc
PATH=.:/bin:/usr/bin:/etc
先搜索当前目录 (危险!可能被恶意程序利用)PATH=/bin:/usr/bin:/etc:.
后搜索当前目录 (危险!可能被恶意程序利用)
- TERM:终端类型 ◆全屏幕操作的软件(如vi),使用它搜索终端库 (环境变量的赋值对某个应用程序,包括java虚拟机以及其他的系统软件,有什么影响,与这 个AP的设计相关,需要查阅相关的手册)
¶相关命令set/env
-
内部命令set列出当前所有变量及其值以及函数定义
- 包括环境变量和局部变量、函数定义
1
set | grep ^fname= #查找fname名称变量
-
外部命令/bin/env列出环境变量及其值
env | more
¶替换
¶shell替换
-
Shell的替换工作:先替换命令行再执行命令
- 文件名生成
- 变量替换
- 命令替换
-
变量替换
1
2ls $HOME
echo "My home is $HOME, Terminal is $TERM" -
文件名生成
遵循文件通配符规则,按照字典序排列
如:ls *.c
文件名替换后实际执行ls a.c x.c
-
shell替换:(反撇号)
1
2now=`date` #以命令date 的stdout替换`date`
./arg `date` #实际执行 ./arg Sun Dec 4 14:54:38 Beijing 2018注意:``内部不能有某些字符
-
shell替换: $()格式
1
2now=$(date) #以命令date 的stdout替换$(date)
./arg $(date) #实际执行 ./arg Sun Dec 4 14:54:38 Beijing 2018 -
shell替换:位置参数
1
2
3
4
5
6$0 #脚本文件本身的名字
$1 $2 #1号命令行参数,2号命令行参数,以此类推
$# #命令行参数的个数
"$*" 等同于"$1 $2 $3 $4 ..."
"$@" 等同于"$1" "$2" "$3" …
#用于把变长的命令行参数传递给其他命令 -
内部命令shift 位置参数的移位操作,
$#
的值减1,旧的$2
变为$1
,旧的$3
变为$2
,以此类推 其他用法如:shift 3
(移位三个位置
¶元字符
¶shell元字符
元字符 | 功能 |
---|---|
空格,制表符 | 命令行参数的分隔符 |
回车 | 执行键入的命令 |
> < | 重定向与管道 (还有 |
; | 用于一行内输入多个命令(还有;; ) |
& | 后台运行 (还有&&) |
$ | 引用shell变量 |
` | 反向单引号,用于命令替换 |
* [] ? | 文件通配符 (echo "*"与echo *不同) |
\ | 取消后继字符的特殊作用(转义) |
( ) | 用于定义shell函数或在子shell中执行一组命令 |
¶转义符
- 反斜线作转义符,取消其后元字符的特殊作用
- 如果反斜线加在非元字符前面,反斜线跟没有一样
¶元字符:单引号与双引号
- 双引号"
- 除$和`外特殊字符的特殊含义被取消(保留一定的灵活性)
- 需要的转义
\"
\$
\\
\` echo *
与echo "*"
- 单引号’
对所括起的任何字符,不作特殊解释。 系统扫描单引号开始,停止对所有字符的特殊解释,直到再次遇到单引号1
2echo "My home dir is $HOME"
echo 'My home dir is $HOME'
可能考查:将’'命令修改成同样功能的""